Любые вопросы новичков по MQL4 и MQL5, помощь и обсуждение по алгоритмам и кодам - страница 738

 
novichok2018:

Всё равно на 12 минуте работы выдает сообщение.

Вставите Print, в начало функции где заполняется массив 

Print("Range = ", ArrayRange(NewsArr,1));

 и покажите количество значений во втором измерении

 
Ilya Prozumentov:

из всего могу сказать, что NomNews попадает в цикл While уже в состоянии больше, чем 999. И тогда нужно искать из-за чего так выходит и где-то ставить сброс этой переменной.

Что бы это проверить впишите в самом начале цикла:

Да, на 11 минуте выдал принт 1000.

 
Alekseu Fedotov:

Вставите Print, в начало функции где заполняется массив 

 и покажите количество значений во втором измерении

Вставил в начало цикла While  и получил бесконечное Range = 1000.  Не туда вставил?

А что это за число (или функция?): datetime TimeNewsFunck(int nomf)

  {

   string s=NewsArr[0][nomf];

   string time=StringConcatenate(StringSubstr(s,0,4),".",StringSubstr(s,5,2),".",StringSubstr(s,8,2)," ",StringSubstr(s,11,2),":",StringSubstr(s,14,4));

   return((datetime)(StringToTime(time) + GMTplus*3600));

  }

и где получает значение int nomf ? Я не нашел.

 
novichok2018:

Вставил в начало цикла While  и получил бесконечное Range = 1000.  Не туда вставил?

А что это за число (или функция?): datetime TimeNewsFunck(int nomf)

  {

   string s=NewsArr[0][nomf];

   string time=StringConcatenate(StringSubstr(s,0,4),".",StringSubstr(s,5,2),".",StringSubstr(s,8,2)," ",StringSubstr(s,11,2),":",StringSubstr(s,14,4));

   return((datetime)(StringToTime(time) + GMTplus*3600));

  }

и где получает значение int nomf ? Я не нашел.

А еще есть вот такая функция, в которой я, как ни пытался, не смог разобраться. Может в ней собака зарыта?

bool CheckInvestingNews(int &pwr,datetime &mintime)
  {

   bool CheckNews=false; pwr=0; int maxPower=0;
   if(MidleNews || HighNews)
     {
      if(TimeCurrent()-LastUpd>=Upd){Print("Investing.com News Loading...");UpdateNews();LastUpd=TimeCurrent();Comment("");}
      WindowRedraw();
      //---Draw a line on the chart news--------------------------------------------
      if(DrawNewsLines)
        {
         for(int i=0;i<NomNews;i++)
           {
            string Name=StringSubstr("NS_"+TimeToStr(TimeNewsFunck(i),TIME_MINUTES)+"_"+NewsArr[1][i]+"_"+NewsArr[3][i],0,63);
            if(NewsArr[3][i]!="")if(ObjectFind(Name)==0)continue;
            if(OnlySymbolNews && StringFind(ValStr,NewsArr[1][i])<0)continue;
            if(TimeNewsFunck(i)<TimeCurrent() && Next)continue;

            color clrf=clrNONE;
            if(HighNews && StringFind(NewsArr[2][i],"High")>=0)clrf=HighColor;
            if(MidleNews && StringFind(NewsArr[2][i],"Moderate")>=0)clrf=MidleColor;
   //         if(LowNews && StringFind(NewsArr[2][i],"Low")>=0)clrf=LowColor;

            if(clrf==clrNONE)continue;

            if(NewsArr[3][i]!="")
              {
               ObjectCreate(0,Name,OBJ_VLINE,0,TimeNewsFunck(i),0);
               ObjectSet(Name,OBJPROP_COLOR,clrf);
               ObjectSet(Name,OBJPROP_STYLE,LineStyle);
               ObjectSetInteger(0,Name,OBJPROP_WIDTH,LineWidth);
               ObjectSetInteger(0,Name,OBJPROP_BACK,true);
              }
           }
        }
      //---------------event Processing------------------------------------
      int ii;
      for(ii=0;ii<NomNews;ii++)
        {
         int power=0;
         if(HighNews && StringFind(NewsArr[2][ii],"High")>=0){ power=3; MinBefore=HighIndentBefore; MinAfter=HighIndentAfter; }
         if(MidleNews && StringFind(NewsArr[2][ii],"Moderate")>=0){ power=2; MinBefore=MidleIndentBefore; MinAfter=MidleIndentAfter; }
 //        if(LowNews && StringFind(NewsArr[2][ii],"Low")>=0){ power=1; MinBefore=LowIndentBefore; MinAfter=LowIndentAfter; }
         if(NFPNews && StringFind(NewsArr[3][ii],"Nonfarm Payrolls")>=0){ power=4; MinBefore=NFPIndentBefore; MinAfter=NFPIndentAfter; }
         if(power==0)continue;

         if(TimeCurrent()+MinBefore*60>TimeNewsFunck(ii) && TimeCurrent()-MinAfter*60<TimeNewsFunck(ii) && (!OnlySymbolNews || (OnlySymbolNews && StringFind(ValStr,NewsArr[1][ii])>=0)))
           {
            if(power>maxPower){   maxPower=power; mintime=TimeNewsFunck(ii); }
              }else{
            CheckNews=false;
           }
        }
      if(maxPower>0){ CheckNews=true; oppoz=true; }
     }
   pwr=maxPower; 
   return(CheckNews);
  }
 
novichok2018:

А еще есть вот такая функция, в которой я, как ни пытался, не смог разобраться. Может в ней собака зарыта?

Это уже только сам автор поймёт, что тут. Лучше код из OnTick() несите

 
novichok2018:

Да, на 11 минуте выдал принт 1000.

Пробуйте заменить

while(!IsStopped())

вот на эту строчку

while(NomNews<300 && !IsStopped())
 
Ilya Prozumentov:

Лишнее  ((2*psd*usd)*((2*psd*usd)-C))/(C-1)) в формуле.

Возведение в степень: ^0.5 это не *0.5

Если не будет ни одной сделки по просматриваемому символу и маджику или же не будет ни одной прибыльной или убыточной сделки, или же будет только одна пара (C=1), то получим деление на 0.

Перед самой формулой, нужно проверить, что бы psd и usd было > 0, а C !=1

Прибыльные у вас считаются с профитом > 1, убыточные < 1, с профитом = 1 не анализируются т. е. 1 надо тоже куда-то включать в ту или иную группу.

В вашей функции сначала лучше произвести отбор номеров сделок подходящих по символу и маджику, потом проверить изменилось ли их количество, если да - пересчитываем zn, если нет то return zn (zn в этом случае не обнулять и проверка  != 0 при принте не потребуется)

Сова перестаёт работать потому, что опирается на переменные ww и nn, а входе работы вашей функции они меняются и рушат алгоритм совы.

При ошибке оформления кода ничего бы не компилировалось.

Могу только сказать спасибо. Это единственное место в рунете, где помогли. 

Теперь принт выдаёт следующее "Stop_Ma_v_5.1 EURUSD,M15: == Z-счёт равен = -nan(ind)" . Не подскажите что бы это значило , код то по идее должен выдавать число ?

Код :

//+------------------------------------------------------------------+
//| Подсчёт z-вероятности. @axe44 Алексей Корольков                  |
//+------------------------------------------------------------------+
  
double Z()
  {
    zn=0;          // z-число
    psd=0;         // кол. положительных сделок
    usd=0;         // количество отрицательных сделок 
    www=0;         // боол переменная 
    nnn=0;         // боол переменная
    kolichestvo=0; // подсчёт закрытых ордеров открытых роботом
    C=0;          // C = количество чередований между отрицательными и положительными сделками
    index=OrdersHistoryTotal(); 
      if(OrdersHistoryTotal()>302) index=301; // берём не более 301 сделки
    //if(index<30) return(0);                 // берём не менее 30
    count=OrdersHistoryTotal();             // считаем от скольки 
    prom=count-index;                       // выделяем только последние сделки
    if (prom<0) prom=0;                     // исключаем ошибки
  
   for( i=prom;i<=count;i++)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY))
        {
         if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic)
           {// далее магия
           pribul=OrderProfit(); 
           if (ww==0&&pribul>1){C++;www=1;nnn=0;}// подсчитываем смену тенденции
           if (nn==0&&pribul<1){C++;www=0;nnn=1;}// подсчитываем смену тенденции 
           if (pribul>1){psd++;}//прибыльные сделки
           if (pribul<1){usd++;}// убыточные сделки
           kolichestvo++;
           }
        }
     }
    /*
Величина Z = (A * (C — 0.5) — B)/   ((B*(B — C))/(C -1))^(1/2), где:
A = количество анализируемых сделок;
B = 2*количество прибыльных сделок * количество убыточных сделок;
C = количество чередований в выборке (чередованием считается каждая пара сделок, 
когда прибыльная сделка сменяет убыточную либо наоборот).
          */ 
            
            if(kolichestvo>30&&psd>0&&usd>0&&C!=1)
            zn=(index*(C-0.5)-2*psd*usd)  /  pow(((2*psd*usd*(2*psd*usd-C))/(C-1)),0.5);
      
     
     
   return(zn);
  }
Спасибо
 
aleksandr bebishev:

Ребята профи Mql5, подсобите с составлением запроса для закрытия позиции на хедж-счете. Ситуация: открыта позиция BUY нужно её закрыть лимитным Sell-ом. Вопрос: как правильно составить запрос, чтобы закрылась именно выбранная позиция, а не открылась новая SELL локирующая BUY??? Прошу, пожалуйста напишите кусок кода с комментариями! Заранее благодарю!

Закрытие одним открытым ордером другого ордера, открытого по тому же самому инструменту, но в противоположном направлении.

bool  OrderCloseBy(
   int        ticket,      // номер ордера для закрытия
   int        opposite,    // номер противоположного ордера
   color      arrow_color  // цвет
   );

Параметры

ticket

[in]  Уникальный порядковый номер закрываемого ордера.

opposite

[in]  Уникальный порядковый номер противоположного ордера.

arrow_color

[in]  Цвет стрелки закрытия на графике. Если параметр отсутствует, или его значение равно CLR_NONE, то стрелка на графике не отображается.

Возвращаемое значение

Возвращает true при успешном завершении функции или false в случае ошибки. Чтобы получить информацию об ошибке, необходимо вызвать функцию GetLastError().

Пример:

  if(iRSI(NULL,0,14,PRICE_CLOSE,0)>75)
    {
     OrderCloseBy(order_id,opposite_id);
     return(0);
    }

П.С. Тут в этой ветке разбирают только MQL4

 
Aliaksei Karalkou:

Могу только сказать спасибо. Это единственное место в рунете, где помогли. 

Теперь принт выдаёт следующее "Stop_Ma_v_5.1 EURUSD,M15: == Z-счёт равен = -nan(ind)" . Не подскажите что бы это значило , код то по идее должен выдавать число ?

Код :

Спасибо
nan - NaN - Not a Number - не число. Попробуйте нормализовать числа в расчёте Z-счёта
 
Aliaksei Karalkou:

Закрытие одним открытым ордером другого ордера, открытого по тому же самому инструменту, но в противоположном направлении.

bool  OrderCloseBy(
   int        ticket,      // номер ордера для закрытия
   int        opposite,    // номер противоположного ордера
   color      arrow_color  // цвет
   );

Параметры

ticket

[in]  Уникальный порядковый номер закрываемого ордера.

opposite

[in]  Уникальный порядковый номер противоположного ордера.

arrow_color

[in]  Цвет стрелки закрытия на графике. Если параметр отсутствует, или его значение равно CLR_NONE, то стрелка на графике не отображается.

Возвращаемое значение

Возвращает true при успешном завершении функции или false в случае ошибки. Чтобы получить информацию об ошибке, необходимо вызвать функцию GetLastError().

Пример:

  if(iRSI(NULL,0,14,PRICE_CLOSE,0)>75)
    {
     OrderCloseBy(order_id,opposite_id);
     return(0);
    }

П.С. Тут в этой ветке разбирают только MQL4

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

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