Требуется помощь

 

Я пытаюсь создать советника на основе своей собственной стратегии, используя код некоторых других советников и инди. но сейчас застрял на одной вещи.

(user defined lot sizes for each trade)

extern string LotsProgression="0.1;0.1;0.2;0.3;0.4;0.6;0.8;1.1;1.5;2.0;2.7;3.6;4.7;6.2;8.0;10.2;13.0;16.5;20.8;26.3;33.1;41.6;52.2;65.5;82.5;103.9;130.9;165;207.9;262;330.1;416;524.7;661.1";

extern bool RestartNewCycle = true;

(and the code)

int init()

{

int i,j,k;

string ls;

while (true) {

        j=StringFind(LotsProgression,";",i);

        if (j>0) {

                ls=StringSubstr(LotsProgression,i,j-i);

                i=j+1;

                k++;

                ArrayResize(lots,k);

                lots[k-1]=StrToDouble(ls);

        } else {

                ls=StringSubstr(LotsProgression,i);

                k++;

                ArrayResize(lots,k);

                lots[k-1]=StrToDouble(ls);

                break;

        }

}



plen=ArraySize(lots);

}

Я не могу понять эту логику или что это на самом деле.

PS: другу понравилась моя стратегия, и он создал этого советника. Но я потерял обоих (советника и контакт друга-кодера), так что теперь я пытаюсь проверить свои базовые знания кодирования, так как я очень хочу, чтобы эта стратегия была закодирована снова.

 
qgmql:

Я пытаюсь написать советника, основанного на моей собственной стратегии, с использованием кода из некоторых других советников и инди. но сейчас застрял на одной вещи.

<удалено>


Пожалуйста, используйте кнопку SRC для размещения кода . . .
 
qgmql: Я не могу понять эту логику или что это на самом деле.

extern string LotsProgression="0.1;0.1;0.2;0.3 ...

double lots[];     // [0]=0.1 [1]=0.1 [2]=0.2 [3]=0.3 [34]=661.1
int    plen;       // 35
int init(){ ... }

Разделяет строку по точкам с запятой, преобразует подстроки в двойки и сохраняет значения в динамический массив.
 

То, что вы упомянули, в порядке. Проблема в остальной части кода. Я получаю две ошибки (только в новом метаредакторе).

'init' - function can be declared only in the global scope

and

'init' - function already defined and has body
 
qgmql:

То, что вы упомянули, в порядке. Проблема в остальной части кода. Я получаю две ошибки (только в новом метаредакторе).

Похоже, что вы объявили init() внутри другой функции, а затем определили ее второй раз...
 

Да, я понял это и исправил. Теперь получаю ошибку в коде таймфрейма.

   //--- EA PARAMETERS
extern int      EA_TF=240;
extern bool     Forced_TF=True;


bool   TF;

     if(Forced_TF != True) TF = EA_TF;     //These two lines i think, have error.
     else TF = Period();                   //New metaeditor is not accepting "TF = EA_TF;" from above line.

Если Forced_TF имеет значение true, то советник должен торговать и получать сигналы только с указанного таймфрейма, даже если активный график (на котором я размещаю советник) открыт на другом таймфрейме. Если значение false, то он должен работать на любом таймфрейме.

 
qgmql:

Да, я понял это и исправил. Теперь получаю ошибку в коде таймфрейма.

Если Forced_TF имеет значение true, то советник должен торговать и получать сигналы только с указанного таймфрейма, даже если активный график (на котором я размещаю советник) открыт на другом таймфрейме. Если значение false, то советник должен работать на любом таймфрейме.

У вас TF имеет значение bool . .. но вы пытаетесь установить его в int... попробуйте это ...

   //--- EA PARAMETERS
extern int      EA_TF=240;
extern bool     Forced_TF=True;


int   TF;

     if(!Forced_TF) TF = EA_TF;     //These two lines i think, have error. 
     else TF = Period();            //New metaeditor is not accepting "TF = EA_TF;" from above line.
 
Опубликуйте ВЕСЬ код или, по крайней мере, укажите усечение. Это IF/ELSE должно быть внутри функции.
 

@RaptorUK Я понял вас. и снова все в порядке со старым редактором, но новый редактор все еще выдает одно предупреждение, процитированное в коде после строки ошибки,

//+------------------------------------------------------------------+
//|                                                   01Multi_EA.mq4 |
//|                      Copyright © 2004, MetaQuotes Software Corp. |
//|                                       http://www.metaquotes.net/ |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2004, MetaQuotes Software Corp."
#property link      "http://www.metaquotes.net/"
#property version   "1.00"
#property strict

//--- input parameters
input int      EA_TF=60;
input bool     Forced_TF=True;
input int      MagicNumber=12345;
input int      FastMA_Period=5;
input int      FastMA_Shift=0;
input int      FastMA_Method=1;
input int      FastMA_Price=0;
input int      SlowMA_Period=34;
input int      SlowMA_Shift=0;
input int      SlowMA_Method=1;
input int      SlowMA_Price=0;
input string   LotsProgression="0.01;0.02;0.03;0.04;0.05;0.06;0.07;0.08;0.09;0.10;0.11;0.12;0.13;0.14;0.15;0.16;0.17;0.18;0.19;0.20";
input bool     NewCycle=True;
input int      Limit_TP=50;
input bool     Use_TP=False;
input int      Limit_SL=50;
input bool     Use_SL=False;
input int      MaxSlippage=3;
input int      OrderTries=10;

int      TF, Plen;
double   TP, SL, pips2dbl, pips2point, pipValue, Slippage, Lots[];
         
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//----
 if(Forced_TF != True) TF = EA_TF;
      else TF = Period();
   int i,j,k;
   string ls;
   while (true) {
        j=StringFind(LotsProgression,";",i);
        if(j>0) {
                ls=StringSubstr(LotsProgression,i,j-i);    // <<<<<"possible use of uninitialized variable 'i'	01Multi_EA.mq4	46	38">>>>>

                i=j+1;
                k++;
                ArrayResize(Lots,k);
                Lots[k-1]=StrToDouble(ls);
        } else {
                ls=StringSubstr(LotsProgression,i);
                k++;
                ArrayResize(Lots,k);
                Lots[k-1]=StrToDouble(ls);
                break;
        }
   }


   Comment("Copyright © 2004, MetaQuotes Software Corp.");
   
   if (Digits == 5 || Digits == 3)
   {            
      pips2dbl = Point*10; pips2point = 10; pipValue = (MarketInfo(Symbol(),MODE_TICKVALUE))*10;
   } 
   else 
   {    
      pips2dbl = Point;   pips2point = 1; pipValue = (MarketInfo(Symbol(),MODE_TICKVALUE))*1;
   }
   
   Slippage = pips2dbl*MaxSlippage;
   TP = pips2dbl*Limit_TP;
   SL = pips2dbl*Limit_SL;
   
//----
   return(INIT_SUCCEEDED);
  }

@WHRoeder Вставил весь код.

 
qgmql:

@RaptorUK Я понял вас. и снова все в порядке со старым редактором, но новый редактор все еще выдает одно предупреждение, процитированное в коде после строки ошибки,

@WHRoeder Вставил весь код.

Это не ошибка, а предупреждение... чтобы избавиться от предупреждения, инициализируйте переменную, а не просто объявляйте ее. В mql4 при объявлении переменной она также инициализировалась, теперь в mql4.5 вы должны явно инициализировать переменную, если хотите...

int i = 0, j, k;   //  i initialised to 0
 
pipValue = (MarketInfo(Symbol(),MODE_TICKVALUE))*10;
Не используйте tickvalue само по себе https://www.mql5.com/en/forum/133792/page3#512466.