Помогите с советником

 

Доброго времени суток. Пытаюсь сделать советник на основе индикатора Ichimoku, так как в программировании я не силен, решил сделать по аналогии советника MACD Simple, если быть более конкретным там почти все с стандартного советника.

В чем суть вопроса. Компилятор ошибок не выдал, но в тестере стратегий категорически отказывается торговать (просто не открывает позиции и все). Если использовать данный код как скрип (вместо OrderSend выскакивает MessageBox покупки или продажи) все работает без проблем.

Вот собственно сам код:

//+------------------------------------------------------------------+
//|                                                     Ichimoku.mq4 |
//|                                    Copyright 2016, Roman Shutov. |
//|                              https://www.mql5.com/ru/users/ainor |
//+------------------------------------------------------------------+
#property copyright "Copyright 2016, Roman Shutov."
#property link      "https://www.mql5.com/ru/users/ainor"
#property version   "1.00"
#property strict
//--- input parameters
input int      Tenkan=9;
input int      Kijun=26;
input int      SenkouSpanB=52;
input int      TakeProfit=100;
input double   TrailingStop=30;
input int      StopLoss=60;
input double   Lots=0.1;
input int      Magic=54321;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
void OnStart()
  {
   double Tenkan_sen;
   double Kijun_sen;
   double SenkouSpan_A;
   double SenkouSpan_B;
   double ChikouSpan;
   int cnt,ticket,total;
//--- Данные индикатора
   Tenkan_sen=iIchimoku(NULL,0,Tenkan,Kijun,SenkouSpanB,MODE_TENKANSEN,0);
   Kijun_sen=iIchimoku(NULL,0,Tenkan,Kijun,SenkouSpanB,MODE_KIJUNSEN,0);
   SenkouSpan_A=iIchimoku(NULL,0,Tenkan,Kijun,SenkouSpanB,MODE_SENKOUSPANA,-Kijun);
   SenkouSpan_B=iIchimoku(NULL,0,Tenkan,Kijun,SenkouSpanB,MODE_SENKOUSPANB,-Kijun);
   ChikouSpan=iIchimoku(NULL,0,Tenkan,Kijun,SenkouSpanB,MODE_CHIKOUSPAN,Kijun);

   total=OrdersTotal();
   if(total<1)
     {
      if(AccountFreeMargin()<(1000*Lots))
        {
         Print("Нет денег. Маржа = ",AccountFreeMargin());
         return;
        }
     }
   if((Tenkan_sen>Kijun_sen) && (SenkouSpan_A>SenkouSpan_B) && (ChikouSpan>Close[Kijun]))
     {
      ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,3,StopLoss,Ask+TakeProfit*Point,"macd sample",Magic,0,Green);
      if(ticket>0)
        {
         if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES))
            Print("BUY order opened : ",OrderOpenPrice());
        }
      else
         Print("Error opening BUY order : ",GetLastError());
      return;
     }

   if((Tenkan_sen<Kijun_sen) && (SenkouSpan_A<SenkouSpan_B) && (ChikouSpan<Close[Kijun]))
     {
      ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,3,StopLoss,Bid-TakeProfit*Point,"Ichimoku",Magic,0,Red);
      if(ticket>0)
        {
         if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES))
            Print("BUY order opened : ",OrderOpenPrice());
        }
      else
         Print("Error opening BUY order : ",GetLastError());
      return;
     }
   for(cnt=0;cnt<total;cnt++)
     {
      if(!OrderSelect(cnt,SELECT_BY_POS,MODE_TRADES))
         continue;
      if(OrderType()<=OP_SELL &&   // check for opened position 
         OrderSymbol()==Symbol())  // check for symbol
        {
         //--- long position is opened
         if(OrderType()==OP_BUY)
           {
            //--- should it be closed?
            if(Tenkan_sen<Kijun_sen)
              {
               //--- close order and exit
               if(!OrderClose(OrderTicket(),OrderLots(),Bid,3,Violet))
                  Print("OrderClose error ",GetLastError());
               return;
              }
            //--- check for trailing stop
            if(TrailingStop>0)
              {
               if(Bid-OrderOpenPrice()>Point*TrailingStop)
                 {
                  if(OrderStopLoss()<Bid-Point*TrailingStop)
                    {
                     //--- modify order and exit
                     if(!OrderModify(OrderTicket(),OrderOpenPrice(),Bid-Point*TrailingStop,OrderTakeProfit(),0,Green))
                        Print("OrderModify error ",GetLastError());
                     return;
                    }
                 }
              }
           }
         else // go to short position
           {
            //--- should it be closed?
            if(Tenkan_sen>Kijun_sen)
              {
               //--- close order and exit
               if(!OrderClose(OrderTicket(),OrderLots(),Ask,3,Violet))
                  Print("OrderClose error ",GetLastError());
               return;
              }
            //--- check for trailing stop
            if(TrailingStop>0)
              {
               if((OrderOpenPrice()-Ask)>(Point*TrailingStop))
                 {
                  if((OrderStopLoss()>(Ask+Point*TrailingStop)) || (OrderStopLoss()==0))
                    {
                     //--- modify order and exit
                     if(!OrderModify(OrderTicket(),OrderOpenPrice(),Ask+Point*TrailingStop,OrderTakeProfit(),0,Red))
                        Print("OrderModify error ",GetLastError());
                     return;
                    }
                 }
              }
           }
        }
     }
//---
  }
//+------------------------------------------------------------------+
 

Ну, для начала, код нужно вставлять правильно: Правильно вставляем код на форуме.

Второе: как Вы думаете, что Вы сделали:

  1. скрипт
  2. индикатор
  3. советник? 

 

Надеялся что советник, но что то мне подсказывает что скрипт.

Заменил OnStart на OnInit вроде бы заработал. Спасибо за помощь)

 
Roman Shutov:
Надеялся что советник, но что то мне подсказывает что скрипт.

Для того, чтобы знать, какие служебные функции должны быть в советнике сгенерируйте себе такой советник в Мастере MQL4: в редакторе MetaEditor на корневой папке MQL4 правый клик мышки и выбор меню "Новый файл" - в Мастере MQL4 выбрать "Советник (шаблон)" - ведите имя советника - никаких чекбоксов не нажимайте. В итоге будет такой шаблон:

//+------------------------------------------------------------------+
//|                                                         Test.mq4 |
//|                        Copyright 2016, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2016, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property strict
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---
   
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---
   
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//---
   
  }
//+------------------------------------------------------------------+


Вот это и есть советник. 

 
Karputov Vladimir:

Для того, чтобы знать, какие служебные функции должны быть в советнике сгенерируйте себе такой советник в Мастере MQL4: в редакторе MetaEditor на корневой папке MQL4 правый клик мышки и выбор меню "Новый файл" - в Мастере MQL4 выбрать "Советник (шаблон)" - ведите имя советника - никаких чекбоксов не нажимайте. В итоге будет такой шаблон:


Вот это и есть советник. 

точнее сказать -- заготовка, или иначе, болванка

которую ещё предстоит наполнить содержимым