Почему советник глючит?

 
extern double Lots               = 0.1;
extern double TakeProfit         = 20;
extern double StopLoss           = 50;
extern int FastEMA=12;
extern int SlowEMA=26;
extern int SignalSMA=3; 
double     ind_buffer1;
double     ind_buffer2;
 
//expert initialization function                                   


   double 
   SL,                                                  // StopLoss   ордера (относит.пункт.)
   TP;                                                  // TakeProfit ордера (относит.пункт.)

int init()
   {
   SL=StopLoss*Point;                                   // StopLoss   ордера (относит.пункт.)
   TP=TakeProfit*Point;                                 // TakeProfit ордера (относит.пункт.)
   return(0);
   }
//----
   
  
  //expert deinitialization function                                 
int deinit()
  {//----
   
//----
   return(0);
  }//expert start function                                            
int start()
  {
 
   double MacdCurrent, MacdPrevious;
   double SignalCurrent;
   int total;
   
   MacdCurrent=iMACD(NULL,0,FastEMA,SlowEMA,SignalSMA,PRICE_CLOSE,MODE_MAIN,0);  
   MacdPrevious=iMACD(NULL,0,FastEMA,SlowEMA,SignalSMA,PRICE_CLOSE,MODE_MAIN,1);    
   SignalCurrent=iMACD(NULL,0,FastEMA,SlowEMA,SignalSMA,PRICE_CLOSE,MODE_SIGNAL,0);   
 
   total=OrdersTotal();
   if(total==0) 
       {
                                                                                           
          if(MacdCurrent>SignalCurrent && MacdCurrent>SignalCurrent)  
             {                                                                                               
              // OrderSend(Symbol(),OP_BUY,Lots,Ask,3,Ask-SL,Ask+TP,"My order #"+OP_BUY,16384,0,Green);
MacdCurrent = OrderSend(Symbol(), OP_BUY, Lots, TP =NormalizeDouble(Ask,Digits),Ask,SL,TP, "My order #"+OP_BUY,16384,NULL, Green);       
               
             }  
             
           
  if(MacdCurrent<SignalCurrent && MacdCurrent<SignalCurrent)  
             {                                                                                               
              
MacdCurrent = OrderSend(Symbol(), OP_SELL, Lots, TP = NormalizeDouble(Bid,Digits),Bid,SL,TP, "My order #"+OP_SELL,16384,NULL, Red);
             }            
             
             
             
             
                                                                                                     
      } 
                                                                                                
//----
   return(0);
  }//+------------------------------------------------------------------+
 

Пытаюсь написать простой советник на Магди........но что то оно не работает как надо! Почему?????

За ранее всем благодарен за помощь!

 
Сергей Дыбленко:

Пытаюсь написать простой советник на Магди........но что то оно не работает как надо! Почему?????

За ранее всем благодарен за помощь!

Уточните, как работает и как надо, чтобы работал. Какую логику хотели бы видеть?

 
Сергей Дыбленко:

Тут, конечно, полный треш :)

Давно не видел, чтобы основная логика советника была написана в start(). Пишите в OnTick().

В MacdCurrent вы получаете тикет открытой позиции и потом сравниваете этот тикет с сигналом?

Зачем два раза проверяется одно и тоже условие MacdCurrent<SignalCurrent && MacdCurrent<SignalCurrent?

Функция OrderSend() собрана жутко. Посмотрите документацию.

 

//+------------------------------------------------------------------+
//| Check for open order conditions                                  |
//+------------------------------------------------------------------+
void CheckForOpen()
  {
   double ma;
   int    res;
//--- go trading only for first tiks of new bar
   if(Volume[0]>1) return;
//--- get Moving Average 
   ma=iMA(NULL,0,MovingPeriod,MovingShift,MODE_SMA,PRICE_CLOSE,0); можешь менять Индикаторы 
//--- sell conditions
   if(Open[1]>ma && Close[1]<ma) тут химичешь

     {
      res=OrderSend(Symbol(),OP_SELL,LotsOptimized(),Bid,3,0,0,"",MAGICMA,0,Red); тут не чего не трогай
      return;
     }
//--- buy conditions
   if(Open[1]<ma && Close[1]>ma) тут химичешь

     {
      res=OrderSend(Symbol(),OP_BUY,LotsOptimized(),Ask,3,0,0,"",MAGICMA,0,Blue); тут не чего не трогай
      return;
     }
//---
  }
//+------------------------------------------------------------------+
 
Alexsandr San:

вот наверное это

//+------------------------------------------------------------------+
//| Check for open order conditions                                  |
//+------------------------------------------------------------------+
void CheckForOpen()
  {
   double MacdCurrent,MacdPrevious;
   double SignalCurrent,SignalPrevious;
   int    res;
//--- go trading only for first tiks of new bar
   if(Volume[0]>1) return;
//--- get Moving Average 
//--- to simplify the coding and speed up access data are put into internal variables
   MacdCurrent=iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_MAIN,0);
   MacdPrevious=iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_MAIN,1);
   SignalCurrent=iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_SIGNAL,0);
   SignalPrevious=iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_SIGNAL,1); можешь менять Индикаторы 
//--- sell conditions
      //--- check for short position (SELL) possibility
      if(MacdCurrent>0 && MacdCurrent<SignalCurrent && MacdPrevious>SignalPrevious) тут химичешь

     {
      res=OrderSend(Symbol(),OP_SELL,Lots,Bid,3,0,0,"",12345,0,Red); тут не чего не трогай
      return;
     }
//--- buy conditions
      //--- check for long position (BUY) possibility

      if(MacdCurrent<0 && MacdCurrent>SignalCurrent && MacdPrevious<SignalPrevious) тут химичешь

     {
      res=OrderSend(Symbol(),OP_BUY,Lots,Ask,3,0,0,"",12345,0,Blue); тут не чего не трогай
      return;
     }
//---
  }
//+------------------------------------------------------------------+

ПОПРАВИЛ -

изменил - вот теперь попробуй !!!!!!!!!!!!!!!!!!!!!

 
Alexsandr San:
спасиб Саш!!!!!!!!!!!
 
Сергей Дыбленко:
спасиб Саш!!!!!!!!!!!

у тебя в терминале, есть готовые эксперты - с них можно всё копировать ( MACD Sample.mq4 ) и ( Moving Average.mq4 )

только меняешь Индикаторы и подгоняешь стрелочки 

пример :

в этих местах -

      //--- check for short position (SELL) possibility
      if(MacdCurrent>0 && MacdCurrent<SignalCurrent && MacdPrevious>SignalPrevious && 
         MacdCurrent>(MACDOpenLevel*Point) && MaCurrent<MaPrevious)
 
Ihor Herasko:

Уточните, как работает и как надо, чтобы работал. Какую логику хотели бы видеть?

открывает только одну сделку
 
Сергей Дыбленко:
открывает только одну сделку

Это потому, что в коде прямое указание на такое повдение:

total=OrdersTotal();
   if(total==0)

Здесь сказано: если нет никаких ордеров (ни рыночных, ни отложенных), то можно открыть рыночный ордер. Если есть хотя бы один из ордеров, то открытие происходить не будет.

Нужно продумать условие открытия бОльшего количества ордеров, а также условия закрытия имеющегося ордера.

 
Сергей Дыбленко:
открывает только одну сделку

вот начало - дальше можешь химичить 

//+------------------------------------------------------------------+
//|                                                          S_D.mq4 |
//|                        Copyright 2020, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2020, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property strict
//---
extern double Lots        = 0.01;
extern double TakeProfit  = 200;
extern double StopLoss    = 500;
extern int    FastEMA     = 12;
extern int    SlowEMA     = 26;
extern int    SignalSMA   = 9;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---

  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
   double MacdCurrent,MacdPrevious;
   double SignalCurrent,SignalPrevious;
   int    res;
//--- go trading only for first tiks of new bar
   if(Volume[0]>1)
      return;
//--- get Moving Average
//--- to simplify the coding and speed up access data are put into internal variables
   MacdCurrent=iMACD(NULL,0,FastEMA,SlowEMA,SignalSMA,PRICE_CLOSE,MODE_MAIN,0);
   MacdPrevious=iMACD(NULL,0,FastEMA,SlowEMA,SignalSMA,PRICE_CLOSE,MODE_MAIN,1);
   SignalCurrent=iMACD(NULL,0,FastEMA,SlowEMA,SignalSMA,PRICE_CLOSE,MODE_SIGNAL,0);
   SignalPrevious=iMACD(NULL,0,FastEMA,SlowEMA,SignalSMA,PRICE_CLOSE,MODE_SIGNAL,1); //можешь менять Индикаторы
//--- sell conditions
//--- check for short position (SELL) possibility
   if(MacdCurrent>0 && MacdCurrent<SignalCurrent && MacdPrevious>SignalPrevious) //тут химичешь
     {
      res=OrderSend(Symbol(),OP_SELL,Lots,Bid,3,Bid+StopLoss*Point,Bid-TakeProfit*Point,"macd sample",16384,0,Red); //тут не чего не трогай
      return;
     }
//--- buy conditions
//--- check for long position (BUY) possibility
   if(MacdCurrent<0 && MacdCurrent>SignalCurrent && MacdPrevious<SignalPrevious) //тут химичешь
     {
      res=OrderSend(Symbol(),OP_BUY,Lots,Ask,3,Ask-StopLoss*Point,Ask+TakeProfit*Point,"macd sample",16384,0,Green);  //тут не чего не трогай
      return;
     }
//---
  }
//+------------------------------------------------------------------+

Снимок

Файлы:
S_D.mq4  6 kb
Причина обращения: