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

 

Тогда еще один вопрос :-)

До перемещения метки с ценой горизонтальное положение вычисляется через текущую ширину экрана

 x=width -70;

Когда я открываю боковую панель, то метка уезжает вправо за границу экрана. Если нажать на кнопку обновить в журнале видно работу индикатора, но метка не возвращается, она появляется только со второй попытки. Получается что OnCalculate вызывается не каждый раз? Как сделать работу функции постоянной?



 
psyman:

Тогда еще один вопрос :-)

До перемещения метки с ценой горизонтальное положение вычисляется через текущую ширину экрана

Когда я открываю боковую панель, то метка уезжает вправо за границу экрана. Если нажать на кнопку обновить в журнале видно работу индикатора, но метка не возвращается, она появляется только со второй попытки. Получается что OnCalculate вызывается не каждый раз? Как сделать работу функции постоянной?

делать опрос и перерисовку в OnChartEvent - CHARTEVENT_CHART_CHANGE

 

Приветствую. Подскажите, пожалста.

Если индикатор отрисовывает стрелки на графике, и стрелки не являются объектами, то можно ли получить параметры такой отрисовки с самого графика или другим способом?  Получить данные из буферов и даже нормально запустить индикатор для тестирования  не удается  

 
Andrey Sokolov:

Приветствую. Подскажите, пожалста.

Если индикатор отрисовывает стрелки на графике, и стрелки не являются объектами, то можно ли получить параметры такой отрисовки с самого графика или другим способом?  Получить данные из буферов и даже нормально запустить индикатор для тестирования  не удается  

А код индикатора есть?

 
Alexey Viktorov:

А код индикатора есть?

нет

Вот здесь обсуждали попытки получить с него данные, и сам индикатор

https://www.mql5.com/ru/forum/160587/page165#comment_10221621

Вопросы от начинающих MQL4 MT4 MetaTrader 4
Вопросы от начинающих MQL4 MT4 MetaTrader 4
  • 2019.01.04
  • www.mql5.com
Если у Вас вопросы по MQL4, MT4, MetaTrader 4, пожалуйста пишите в этой теме. Особенно когда вопросы касаются торговых функций...
 

Изучаю примеры из учебника, один из них не компилируется на строке

   Print("Запущен эксперт с именем ",MQLInfoString(MQL5_PROGRAM_NAME)); 

'MQL5_PROGRAM_NAME' - cannot convert enum mouse_2.mq5 29 52


 
Ilya Prozumentov:

Разрешение на работу для советника проверь. И где в принт вывод? Этот кусок кода по-лбому что-то возвращает, раз ошибок нет, значит проблема за пределами этого куска кода. В этом куске разве, что деление на 0 может возникать

Код целиком ? Да, сейчас .

//+------------------------------------------------------------------+
//|                                                 Stop_Ma_v5.1.mq4 |
//|                                            Copyright 2018, axe44 |
//|                                 http://axe44.opentraders.ru/bio/ |
//+------------------------------------------------------------------+
#property copyright "Copyright 2018,@ axe44"
#property link      "gerchikco.com/registration/?ref=sfaCLYmR"
#property version   "5.10"
#property strict

//--- Inputs
extern double Lots       = 0.1;     // Lots лот
extern bool Z_schet      = 1;       // Z_schet з-тенденция
extern int Expir         = 20;       // Expir истечение в часах
extern double klot       = 1.5;     // klot - множитель тенденции
extern int StopLoss      = 200;     // StopLoss лось
extern int TakeProfit    = 300;     // TakeProfit язь
extern int BULevel       = 0;       // BULevel уровень БУ
extern int BUPoint       = 3;       // BUPoint пункты БУ
extern int Spred         = 4;       // Spred спред 
extern int TrailingStop  = 0;       // TrailingStop трал
input ENUM_TIMEFRAMES TF1 = PERIOD_M15;//TF1 Время АТР
extern int Stop            = 14;           // Stop Периуд Stop
//extern int Atr_Procent   = 20;       //Atr_Procent  Максимальный процент АТР для работы
input ENUM_TIMEFRAMES TF2  = PERIOD_M15;//TF2 Время Ма открытия\закрытия 
//extern int Pr            = 50;       // Pr Процент разницы движения.
extern int MA            = 14;           //MA Периуд MA
extern int MaM           = 3;        //MaM способ расчёта Ма   
extern int StartHour     = 0;        //StartHour час начала торговли
extern int StartMin      = 30;       //StartMin минута начала торговли
extern int EndHour       = 23;       //EndHour час окончания торговли
extern int EndMin        = 30;       //EndMin минута окончания торговли
extern int Slip          = 30;       //Slip реквот
extern int Magic         = 124;      //Magic магик
extern int TesterMinPercentProfitTrades=50;
extern int AutoLot       = 1;        // автолот

double atr,ma,rm,pm,minatr,lot,hma,lma,min,max,zn,C,pribul;
double NormalP[302];
int i,count,prom,index,psd,usd;
datetime t=1,day,hour;
bool ww,nn,bb,ss;


//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---
   if(Digits==3 || Digits==5)
     {
      TakeProfit*=10;
      StopLoss*=10;
      TrailingStop*=10;
      BUPoint*=10;
      BULevel*=10;
      Slip*=10;
      Spred*=10;
      
     }
//---
   return(INIT_SUCCEEDED);
  }
  

//+------------------------------------------------------------------+
//| расчёт лота                                                      |
//+------------------------------------------------------------------+
double MoneyManagement()
  {
   double DynamicLot=0;
   double Free_Equity=AccountEquity();
   if(Free_Equity<=0)return(0);
   double TickValue=MarketInfo(Symbol(),MODE_TICKVALUE);
   double LotStep=MarketInfo(Symbol(),MODE_LOTSTEP);
   double MinLot=MarketInfo(Symbol(),MODE_MINLOT);
   double MxLot=MarketInfo(Symbol(),MODE_MAXLOT);
   if (TickValue*LotStep!=0) DynamicLot=MathFloor((Free_Equity*MathMin(AutoLot/10,100)/1000)/StopLoss*TickValue/LotStep)*LotStep; 
   if(DynamicLot<MinLot)DynamicLot=MinLot;
   if(DynamicLot>MxLot)DynamicLot=MxLot;
   return(DynamicLot);
  }
  
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
   Comment("");
  }

//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 30.04.2009                                                     |
//|  Описание : Возвращает флаг разрешения торговли по времени.                |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    hb - часы времени начала торговли                                       |
//|    mb - минуты времени начала торговли                                     |
//|    he - часы времени окончания торговли                                    |
//|    me - минуты времени окончания торговли                                  |
//+----------------------------------------------------------------------------+
bool isTradeTimeInt(int hb=0,int mb=0,int he=0,int me=0)
  {
   datetime db, de;           // Время начала и окончания работы
   int      hc;               // Часы текущего времени торгового сервера

   db=StrToTime(TimeToStr(TimeCurrent(), TIME_DATE)+" "+(string)hb+":"+(string)mb);
   de=StrToTime(TimeToStr(TimeCurrent(), TIME_DATE)+" "+(string)he+":"+(string)me);
   hc=TimeHour(TimeCurrent());

   if(db>=de)
     {
      if(hc>=he) de+=24*60*60; else db-=24*60*60;
     }

   if(TimeCurrent()>=db && TimeCurrent()<=de) return(True);
   else return(False);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void PutOrder(int type,double price)
  {
   int r=0;
   color clr=Green;
   double sl=0,tp=0;

   if(type==1 || type==3 || type==5)
     {
      clr=Red;
      if(StopLoss>0) sl=NormalizeDouble(price+StopLoss*Point,Digits);
      if(TakeProfit>0) tp=NormalizeDouble(price-TakeProfit*Point,Digits);
     }

   if(type==0 || type==2 || type==4)
     {
      clr=Blue;
      if(StopLoss>0) sl=NormalizeDouble(price-StopLoss*Point,Digits);
      if(TakeProfit>0) tp=NormalizeDouble(price+TakeProfit*Point,Digits);
     }
   if(AutoLot>0){lot=MoneyManagement();}
   if(AutoLot<=0){lot=Lots;}
   r=OrderSend(NULL,type,lot,NormalizeDouble(price,Digits),Slip,sl,tp,"",Magic,TimeCurrent()+Expir*60*60,clr);
   return;
  }
//+------------------------------------------------------------------+
//| история                                                          |
//+------------------------------------------------------------------+
double history()
{

   if(OrderSelect(OrdersHistoryTotal()-1,SELECT_BY_POS,MODE_HISTORY))
     {   
      pribul=OrderProfit(); 
     }
     

return(pribul);
}
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+

int CountOrders(int type)
  {
    count=0;
   for( i=OrdersTotal()-1;i>=0;i--)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
        {
         if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic)
           {
            if(OrderType()==type) count++;
           }
        }
     }
   return(count);
  }

//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+

int CountTrades()
  {
    count=0;
   for( i=OrdersTotal()-1;i>=0;i--)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
        {
         if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic)
           {
            if(OrderType()<2) count++;
           }
        }
     }
   return(count);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
  
double Znomer()
  {
    zn=0;         // z-число
    psd=0;        // кол. положительных сделок
    usd=0;        // количество отрицательных сделок 
    ww=0;         // боол переменная 
    nn=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=count;i>prom;i--)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY)== true)
        {
         if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic)
           {// далее магия
           pribul=OrderProfit(); 
           if (ww==0&&pribul>1){C++;ww=1;nn=0;}// подсчитываем смену тенденции
           if (nn==0&&pribul<1){C++;ww=0;nn=1;}// подсчитываем смену тенденции 
           if (pribul>1){psd++;}//прибыльные сделки
           if (pribul<1){usd++;}// убыточные сделки
           
           }
        }
     }
    /*/*
Величина Z = (A * (C — 0.5) — B)/   ((B*(B — C))/(C -1))^(1/2), где:
A = количество анализируемых сделок;
B = 2*количество прибыльных сделок * количество убыточных сделок;
C = количество чередований в выборке (чередованием считается каждая пара сделок, 
когда прибыльная сделка сменяет убыточную либо наоборот).
           */
            index=psd+usd;
            if(index<30) return(0);
            zn=(index*(C-0.5)-(2*psd*usd))/
             ((((2*psd*usd)*((2*psd*usd)-C))/
            (C-1))*((((2*psd*usd)*((2*psd*usd)-C))/
            (C-1))*0.5));
      
     
     
   return(zn);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void Trailing()
  {
   bool mod;
   for( i=OrdersTotal()-1;i>=0;i--)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
        {
         if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic)
           {
            if(OrderType()==OP_BUY)
              {
               if(Bid-OrderOpenPrice()>TrailingStop*Point)
                 {
                  if((OrderStopLoss()<(Bid-TrailingStop*Point)) || (OrderStopLoss()==0))
                    {
                     mod=OrderModify(OrderTicket(),OrderOpenPrice(),Bid-TrailingStop*Point,OrderTakeProfit(),0,Yellow);
                     return;
                    }
                 }
              }

            if(OrderType()==OP_SELL)
              {
               if((OrderOpenPrice()-Ask)>TrailingStop*Point)
                 {
                  if((OrderStopLoss()>(Ask+TrailingStop*Point)) || (OrderStopLoss()==0))
                    {
                     mod=OrderModify(OrderTicket(),OrderOpenPrice(),Ask+TrailingStop*Point,OrderTakeProfit(),0,Yellow);
                     return;
                    }
                 }
              }
           }
        }
     }
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void BU()
  {
   bool m;
   for( i=OrdersTotal()-1;i>=0;i--)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
        {
         if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic)
           {
            if(OrderType()==OP_BUY)
              {
               if(OrderOpenPrice()<=(Bid-(BULevel+BUPoint)*Point) && OrderOpenPrice()>OrderStopLoss())
                 {
                  m=OrderModify(OrderTicket(),OrderOpenPrice(),OrderOpenPrice()+BUPoint*Point,OrderTakeProfit(),0,Yellow);
                  
                 }
              }

            if(OrderType()==OP_SELL)
              {
               if(OrderOpenPrice()>=(Ask+(BULevel+BUPoint)*Point) && (OrderOpenPrice()<OrderStopLoss() || OrderStopLoss()==0))
                 {
                  m=OrderModify(OrderTicket(),OrderOpenPrice(),OrderOpenPrice()-BUPoint*Point,OrderTakeProfit(),0,Yellow);
                  
                 }
              }
           }
        }
     }
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void CloseAll(int ot=-1)
  {
   bool cl;
   for( i=OrdersTotal()-1;i>=0;i--)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
        {
         if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic)
           {
            if(OrderType()==0 && (ot==0 || ot==-1))
              {
               RefreshRates();
               cl=OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(Bid,Digits),Slip,White);
              }
            if(OrderType()==1 && (ot==1 || ot==-1))
              {
               RefreshRates();
               cl=OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(Ask,Digits),Slip,White);
              }
           }
        }
     }
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {  
  if(t!=Time[0]&&(Ask-Bid)<Spred*Point)
 {
   ww=1;
   nn=1;
   t=Time[0]; 
   if(TrailingStop>0) Trailing();
   if(BULevel>0) BU();   
  
  rm = iMA(NULL,TF2,MA,0,MaM,0,1)-iMA(NULL,TF2,MA,0,MaM,1,1); 
  pm = iMA(NULL,TF2,MA,0,MaM,0,2)-iMA(NULL,TF2,MA,0,MaM,1,2);   
  
  // Stop
  
  //---- maximums counting 

        hma = High[iHighest(NULL,0,MODE_HIGH,Stop,1)]; 
        lma = Low[iLowest(NULL,0,MODE_LOW,Stop,1)];
        
//----
//Print("hma ",hma);
//Print("lma ",lma);
//if ( Znomer()!=0) {zn=Znomer();Print("== Z-счёт равен = ",zn);}     

  }
  
  if(ww==1 && pm<0 && rm>0 && isTradeTimeInt(StartHour,StartMin,EndHour,EndMin)) {if(Ask<hma)PutOrder(4,hma);
                                                                                  if(Bid>lma)PutOrder(5,lma);
                                                                                  ww=0;}// Если цена раньше падала а теперь растёт
  if(nn==1 && pm>0 && rm<0 && isTradeTimeInt(StartHour,StartMin,EndHour,EndMin)) {if(Ask<hma)PutOrder(4,hma);
                                                                                  if(Bid>lma)PutOrder(5,lma);
                                                                                  nn=0;}
   
   
   
 }
//+------------------------------------------------------------------+

//+------------------------------------------------------------------+
//| Tester function                                                  |
//+------------------------------------------------------------------+
double OnTester()
{
    double PercentProfitTrades = 0;
    if (TesterStatistics(STAT_PROFIT_TRADES) > 0)
        PercentProfitTrades = TesterStatistics(STAT_PROFIT_TRADES) / TesterStatistics(STAT_TRADES) * 100;
    if (PercentProfitTrades >= TesterMinPercentProfitTrades)
         return(NormalizeDouble((TesterStatistics(STAT_PROFIT) / TesterStatistics(STAT_EQUITY_DD)), 2));
    else return(0);
}
//+------------------------------------------------------------------+

Строчка 378 - тот  самый принт, включив который, советник уже не работает.

У меня есть подозрение что ошибка в оформлении кода в строчке 221 и 223 . Перебор истории никто не использует, примеров мало, поэтому возможно ошибка. Есть один пример на  странице https://www.mql5.com/ru/code/7452 , но это там для меня слишком сложно.
Деление на ноль в функции Znomer() строчка 206 я исключил . 


Жду инструкций и рекомендаций. Спасибо.

Вычисление Z-счета
Вычисление Z-счета
  • www.mql5.com
Включаемый файл Z_include.mqh содержит функцию, которая вычисляет на массиве данных следующие параметры: Max - максимальное значение;Min - минимальное значение;матожидание - среднее значение;стандартное отклонение - среднеквадратичное отклонение (несмещенную оценку);скос;эксцесс;Z-счет на массиве данных. Описание понятия Z -счет смотрите в...
 
Andrey Sokolov:

нет

Вот здесь обсуждали попытки получить с него данные, и сам индикатор

https://www.mql5.com/ru/forum/160587/page165#comment_10221621

Извиняйте, я принципиально не запускаю .dll на своём компе, дальше без меня.
 
Alexey Viktorov:
Извиняйте, я принципиально не запускаю .dll на своём компе, дальше без меня.

Здесь только индикаторы. При использовании в параметрах отключал использование второго.

Файлы:
BiforexV1.zip  161 kb
 
Aliaksei Karalkou:

Код целиком ? Да, сейчас .

Строчка 378 - тот  самый принт, включив который, советник уже не работает.

У меня есть подозрение что ошибка в оформлении кода в строчке 221 и 223 . Перебор истории никто не использует, примеров мало, поэтому возможно ошибка. Есть один пример на  странице https://www.mql5.com/ru/code/7452 , но это там для меня слишком сложно.
Деление на ноль в функции Znomer() строчка 206 я исключил . 


Жду инструкций и рекомендаций. Спасибо.

zn=(index*(C-0.5)-(2*psd*usd))	/   ((((2*psd*usd)*((2*psd*usd)-C))/(C-1))*((((2*psd*usd)*((2*psd*usd)-C))/(C-1))*0.5));

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

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

zn=(index*(C-0.5)-2*psd*usd)  /  pow(((2*psd*usd*(2*psd*usd-C))/(C-1)),0.5);

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

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

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

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

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

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