[ВНИМАНИЕ, ТЕМА ЗАКРЫТА!] Любой вопрос новичка, чтоб не захламлять форум. Профи, не проходите мимо. Без вас никуда. - страница 239

 
dmmikl86 >>:

ув. форумчане!

вот написал индикатор - и проблема, не рисуеться средняя скользящая (Buf_2), вот код:

помогите понять в чем проблема?

А с чего бы ему рисоваться если вы после //average в цикл не входите у вас i<0 иначе вы из предидущего цикла не выйдите

 i++; // поставьте здесь увеличение на один и всё заработает или присвойте i=0; напрямую ноль
//====================================================================
// average
int n=0;
   while(i>=0) 
      {  
       //----
       while(n<=average){
         Buf_2[i]=Buf_1[i-n];
         n++;
         }
       
       i--;
       //----
      }

//----
   return(0);
  }
//+------------------------------------------------------------------+
 

Доброго времени суток)


Простите за назойливость, уже задавал этот вопрос но так и не понял ответа( вообщем, за неделю ничего не сдвинулось с места


Подскажите как написать функцию постановки отложенного ордера?


ЧТО ВБИТЬ вместо Bid или Ask? Мне нужен отложеник по High одной из свеч. Я получаю это значение и как мне его ввести в функцию? Ведь данной цены может и не быть в потоке торговом? Вообщем не могли бы выложить код постановки отложенника, главное откуда брать цену постановки его?!!

 

Для примера(пример установки бай-стопа) :

(для установки отложки вовсе не нужно, чтобы цена установки была в потоке котировок.

Можно плясать от текущей цены или брать любую цену, чтобы только соблюдался допустимый в этом ДЦ стопуровень  ОТ ТЕКУЩЕЙ ЦЕНЫ ДО ЦЕНЫ УСТАНОВКИ ОТЛОЖКИ)

( 'EURUSD - Тенденции, прогнозы и следствия' )

extern int      Magic = 77777;
extern int      StopLoss=400;
extern int      TakeProfit=120;
extern double   Lots=0.1;

static int prevtime = 0;
//-- Подключаемые модули --
#include <stderror.mqh>
#include <stdlib.mqh>


//=======================================================
int start()
{
if(Time[0] == prevtime)   return(0);//ждём появления нового бара
   prevtime = Time[0];//если появился новый бар , включаемся
   

//-----------------------------------------------------------------------
if ( NumberOfOrders(NULL,OP_BUYSTOP,Magic)<1 )  {//если нет открытых бай- поз.
if   (NumberOfPositions(NULL,OP_BUY, Magic)<1)  {//если нет ордеров байстоп
double priceBUY=iHigh(NULL,0,iHighest(NULL,0,MODE_HIGH,50,0));//-задаем цену
// установки  ордера по максимуму из посл. 50-ти свечей
double SL=0;double TP=0;//выставляем стопы
if(StopLoss>0)   SL=priceBUY-Point*StopLoss;
if(TakeProfit>0) TP=priceBUY+Point*TakeProfit;  
//ставим ордер 
ticket=OrderSend(Symbol(),OP_BUYSTOP,Lots,price,5,SL,TP,"байстоп",Magic,0,Blue);
if(ticket < 0) { Print("Ошибка открытия ордера BUY #", GetLastError()); 
               Sleep(10000);   return (0); }
}}
//--------------------------------------------------------------------------

Аналогично ставится селл-стоп


//----------------------------------------------------------------------------
return (0);
 //-----------------Конец функции int start()----
}//int start()

//--------ставим пользовательские функции -------------

Вместо 

double priceBUY=..... ....

вводите свою формулу

 

пишу индикатор, суть которого такая: если свеча бычья линия индикатора вверх, медвежья вниз. ну и ко всему этому добавляется объем (чтобы каждая свеча имела вес объема). И вторая линия средняя скользящая от текущей линии

#property indicator_separate_window
#property indicator_buffers 2
#property indicator_color1 Lime
#property indicator_color2 Red

extern int average=14;
//---- buffers
double Buf_1[], Buf_2[];
double sum_b;

//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init()
  {
//---- indicators
   SetIndexStyle(0,DRAW_LINE);
   SetIndexBuffer(0, Buf_1);
   SetIndexStyle(1,DRAW_LINE);
   SetIndexBuffer(1, Buf_2);
   
   sum_b=0.0;
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator deinitialization function                       |
//+------------------------------------------------------------------+
int deinit()
  {
//----
   
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int start()
  {
   int    i, 
          Counted_bars=IndicatorCounted();

int n=0;
//----
//====================================================================
// график тела с объемом

i=Bars-Counted_bars-1;           // Индекс первого непосчитанного
   while(i>=0) 
      {  
       //----
       if (Close[i]>Open[i]) {
         sum_b = sum_b + (Close[i]-Open[i])*Volume[i];
         Buf_1[i]=sum_b;
         }
         
       if (Close[i]<Open[i]) {
         sum_b = sum_b - (Open[i]-Close[i])*Volume[i];
         Buf_1[i]=sum_b;
         }
         
       if (NormalizeDouble(Close[i],Digits)==NormalizeDouble(Open[i],Digits)) {
         Buf_1[i] = Buf_1[i-1];
         }
       
       // average  
       while(n<=average){
         Buf_2[i]=Buf_1[i-n];
         n++;
         }

       i--;
       //----
      }
//====================================================================


//----
   return(0);
  }
//+------------------------------------------------------------------+
проблемы: основная линия рисует пики при формировании доджа, и не рисуется средняя скользящая?
 
dmmikl86 >>:

пишу индикатор, суть которого такая: если свеча бычья линия индикатора вверх, медвежья вниз. ну и ко всему этому добавляется объем (чтобы каждая свеча имела вес объема). И вторая линия средняя скользящая от текущей линии

проблемы: основная линия рисует пики при формировании доджа, и не рисуется средняя скользящая?


Блок if-ов можно заменить на более эффективный

if (Close[i]>Open[i]) {
         sum_b = sum_b + (Close[i]-Open[i])*Volume[i];
         Buf_1[i]=sum_b;
}
else if (Close[i]<Open[i]) {
         sum_b = sum_b - (Open[i]-Close[i])*Volume[i];
         Buf_1[i]=sum_b;
}
else {  //       if (NormalizeDouble(Close[i],Digits)==NormalizeDouble(Open[i],Digits)) {
         Buf_1[i] = Buf_1[i + 1];
}

[i + 1] - т.к. нумерация в индексных массивах идет справа налево. Теперь свечи с нулевым телом будут правильно обрабатываться.

Со средней линией buf_2 из кода вообще не понятно чего хотел автор.


 
OneDepo >>:

Блок if-ов можно заменить на более эффективный

[i + 1] - т.к. нумерация в индексных массивах идет справа налево. Теперь свечи с нулевым телом будут правильно обрабатываться.

Со средней линией buf_2 из кода вообще не понятно чего хотел автор.


хотел чтобы это было среднее скользящее с периодом 14, построенное по значению индикатора

 
dmmikl86 >>:

хотел чтобы это было среднее скользящее с периодом 14, построенное по значению индикатора

Тогда вот так:

//+------------------------------------------------------------------+
//|                                                     dmmikl86.mq4 |
//|                      Copyright © 2007, MetaQuotes Software Corp. |
//|                                        http://www.metaquotes.net |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2007, MetaQuotes Software Corp."
#property link      "http://www.metaquotes.net"

#property indicator_separate_window
#property indicator_buffers 2
#property indicator_color1 Lime
#property indicator_color2 Red

extern int BarsCount = 1000;
extern int average=14;

//---- buffers
double Buf_1[], Buf_2[];

//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init()
  {
    if (average < 1)
        average = 1;

    //---- indicators
    SetIndexStyle(0,DRAW_LINE);
    SetIndexBuffer(0, Buf_1);
    SetIndexStyle(1,DRAW_LINE);
    SetIndexBuffer(1, Buf_2);
    //----
    return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator deinitialization function                       |
//+------------------------------------------------------------------+
int deinit()
  {
//----
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int start()
{
    int i, n;

    //====================================================================
    // график тела с объемом
    double s, sum_b = 0;

    int limit = BarsCount;
    if (limit > Bars)
        limit = Bars;

    for (i = limit; 0 <= i; i--) {

        if (Close[i]>Open[i]) {
            sum_b += (Close[i]-Open[i])*Volume[i];
            Buf_1[i] = sum_b;
        }
        else if (Close[i]<Open[i]) {
            sum_b -= (Open[i]-Close[i])*Volume[i];
            Buf_1[i] = sum_b;
        }
        else {
            Buf_1[i] = Buf_1[i + 1];
        }

        // SMA calculation
        if (i + average < limit) {
            s = 0;
            for (n = 0; n < average; n++) {
                s += Buf_1[i+n];
            }
            Buf_2[i] = s/average;
        }

    }

    return(0);
  }
//+------------------------------------------------------------------+
 
как сделать так, чтобы производилась сделка один раз в бар, больше на этом баре не открывались ордера если уже была сделка на этом баре?
 
Достаточно посмотреть эту ветку.
 
Vinin >>:
Достаточно посмотреть эту ветку.

Или прочитать задачу 27 в учебнике Ковалева. Там есть примеры кода и подробное объяснение его работы.

Причина обращения: