Нужна помощь!!!

 

Как прописать в советнике так, что бы сделка открывалась 1 раз по пересечению нулевой линии MACD ??

маюсь 3 день уже...

1

Зарание спасибо)

 
Dronix74:

Как прописать в советнике так, что бы сделка открывалась 1 раз по пересечению нулевой линии MACD ??

маюсь 3 день уже...

Зарание спасибо)

На нулевом баре производите проверку:


double Bar1 =  iMACD(string symbol, int timeframe, int fast_ema_period, int slow_ema_period, int signal_period, int applied_price, MODE_MAIN, 1 );

double Bar2 =  iMACD(string symbol, int timeframe, int fast_ema_period, int slow_ema_period, int signal_period, int applied_price, MODE_MAIN, 2 );

if ( Bar2 >0 && Bar1 < 0) Sell();

if ( Bar2  < 0 && Bar1 > 0) Buy();

Что-то в таком духе.... 


 
Dronix74:

Как прописать в советнике так, что бы сделка открывалась 1 раз по пересечению нулевой линии MACD ??

Это невозможно. Любые возможные варианты такой реализации будут запаздывать. А если это пересечение будет происходить следующие баров 10 туда сюда? Причем по паре пипсов. Куда сделки открывать?
 
Arles:
Это невозможно. Любые возможные варианты такой реализации будут запаздывать. А если это пересечение будет происходить следующие баров 10 туда сюда? Причем по паре пипсов. Куда сделки открывать?


Вот сама программа:

 

datetime dt_Previous_0 = 0;
int Start()
{
    if (Time[0] ==  dt_Previous_0 )
        return; 
    dt_Previous_0 = Time[0];
    
    if (OrdersTotal() != 0) return;
    
    double d_Bar1 =  iMACD(NULL, 0, 12, 26, 9, PRICE_CLOSE, MODE_MAIN, 1 );
    double d_Bar2 =  iMACD(NULL, 0, 12, 26, 9, PRICE_CLOSE, MODE_MAIN, 2 );

   if ( d_Bar2   >0 && d_Bar1 < 0) Sell();
   if ( d_Bar2  < 0 && d_Bar1 > 0) Buy();

   return;
}

void Sell()
{
........
}

void Buy()
{
...........
}

Что-то в таком духе.... 

 

Спасибо за совет))

Но вот как сделать так, чтоб сделка открывалась одна, а не целая туча??

 
Dronix74:

Спасибо за совет))

Но вот как сделать так, чтоб сделка открывалась одна, а не целая туча??

Сделать проверку на наличие открытых ордеров бай и селл. 

 
Dronix74:

Спасибо за совет))

Но вот как сделать так, чтоб сделка открывалась одна, а не целая туча??

Проверять количество открытых ордеров: для "тех, кто в танке" можно через OredersTotal().
 
Dronix74:

Спасибо за совет))

Но вот как сделать так, чтоб сделка открывалась одна, а не целая туча??


Что-то не пойму я, какая куча ? Открытым будет всегда один ордер...для этого и мы и пишем:

 if (OrdersTotal() != 0) return;

 

Вот, наблюдается такая картина)

1

И Ваш совет опять помог)) теперь открывается 1 сделка и после ее закрытия открывается новая...

Как прописать, что бы сделка закрывалась по сигналу индикатора?

 
Dronix74:

Вот, наблюдается такая картина)

И Ваш совет опять помог)) теперь открывается 1 сделка и после ее закрытия открывается новая...

Как прописать, что бы сделка закрывалась по сигналу индикатора?


datetime dt_Previous_0 = 0;
int Start()
{
    if (Time[0] ==  dt_Previous_0 )
        return; 
    dt_Previous_0 = Time[0];
    
    if (OrdersTotal() != 0) return;
    
    double d_Bar1 =  iMACD(NULL, 0, 12, 26, 9, PRICE_CLOSE, MODE_MAIN, 1 );
    double d_Bar2 =  iMACD(NULL, 0, 12, 26, 9, PRICE_CLOSE, MODE_MAIN, 2 );

   if ( d_Bar2   >0 && d_Bar1 < 0){ Sell(); CloseBuy(); }
   if ( d_Bar2  < 0 && d_Bar1 > 0) { Buy(); CloseSell()

   return;
}

void Sell()
{
........
}

void Buy()
{
...........
}

void CloseBuy();
{
...
}

void CloseSell()
{
...
}
Something like this....
 
more:

Something like this....


Это не совсем правильно OrdersTotal() возвращает все ордера по всем меджикам и по всем символам ....

Вам нужно изначально проверить наличие ваших ордеров через цикл

 Примерно так 

 for (i=OrdersTotal(); i>=0; i--       )
  if(OrderSelect(i,SELECT_BY_POS)==true)
  if(OrderSymbol()==Symbol()           )
  if(OrderMagicNumber()==Magic         )
  {
  n++; 
   if ( OrderType()==0 ) 
   { 
    b++; 
   }
   if ( OrderType()==1 ) 
   { 
    s++; 
   }
  }
Причина обращения: