Tutte le domande dei nuovi arrivati su MQL4 e MQL5, aiuto e discussione su algoritmi e codici - pagina 734

 

Un'altra domanda allora :-)

Prima di spostare l'indicatore di prezzo, la posizione orizzontale è calcolata attraverso la larghezza attuale dello schermo

 x=width -70;

Quando apro la barra laterale, il marcatore si sposta a destra oltre il confine dello schermo. Se premo il pulsante di aggiornamento nel registro posso vedere che l'indicatore funziona, ma l'indicatore non ritorna, appare solo al secondo tentativo. Risulta che OnCalculate non viene chiamato ogni volta? Come far funzionare la funzione in modo permanente?



 
psyman:

Un'altra domanda allora :-)

Prima di spostare l'indicatore di prezzo, la posizione orizzontale è calcolata attraverso la larghezza attuale dello schermo

Quando apro la barra laterale, il marcatore si sposta a destra oltre il confine dello schermo. Se premo il pulsante di aggiornamento nel registro posso vedere che l'indicatore funziona, ma l'indicatore non ritorna, appare solo al secondo tentativo. Risulta che OnCalculate non viene chiamato ogni volta? Come fare in modo che questa funzione funzioni sempre?

fare il polling e ridisegnare inOnChartEvent - CHARTEVENT_CHART_CHANGE

 

Saluti. Può dirmi qualcosa?

Se l'indicatore disegna frecce sul grafico e le frecce non sono oggetti, è possibile ottenere i parametri di tale disegno dal grafico stesso o in qualche altro modo? Non posso ottenere i dati dai buffer e nemmeno eseguire l'indicatore per i test normalmente

 
Andrey Sokolov:

Saluti. Può dirmi qualcosa?

Se l'indicatore disegna frecce sul grafico e le frecce non sono oggetti, è possibile ottenere i parametri di tale disegno dal grafico stesso o in qualche altro modo? Non posso ottenere i dati dai buffer e nemmeno eseguire l'indicatore per i test normalmente

Avete il codice dell'indicatore?

 
Alexey Viktorov:

C'è un codice per l'indicatore?

no

I tentativi di ottenere dati da esso, e l'indicatore stesso, sono stati discussi qui

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, пожалуйста пишите в этой теме. Особенно когда вопросы касаются торговых функций...
 

Sto studiando gli esempi nel tutorial e uno di essi non riesce a compilare sulla linea

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

'MQL5_PROGRAM_NAME' - non può convertire enum mouse_2.mq5 29 52


 
Ilya Prozumentov :

Verificare il permesso di lavoro per un consulente. E dov'è l'output nella stampa? Questo pezzo di codice sembra restituire qualcosa, poiché non ci sono errori, quindi il problema è al di fuori di questo pezzo di codice. In questo pezzo, tranne per il fatto che può verificarsi una divisione per 0

Codice intero? Si Adesso .

 //+------------------------------------------------------------------+
//|                                                 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 );
}
//+------------------------------------------------------------------+

La riga 378 è la stessa stampa, quando abilitata, l'EA non funziona più.

Ho il sospetto che ci sia un errore nella progettazione del codice nelle righe 221 e 223 . Nessuno usa l'enumerazione della cronologia, ci sono pochi esempi, quindi è possibile un errore. C'è un esempio nella pagina https://www.mql5.com/en/code/7452 , ma è troppo complicato per me lì.
Divisione per zero nella funzione Znomer(), riga 206, ho escluso.


Attendo istruzioni e consigli. Grazie.

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

no

I tentativi di ottenere dati da esso, e l'indicatore stesso, sono stati discussi qui

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

Mi dispiace, non eseguo la .dll sul mio computer per una questione di principio, andate avanti senza di me.
 
Alexey Viktorov:
Mi dispiace, non eseguo la .dll sul mio computer per una questione di principio, andate avanti senza di me.

Solo gli indicatori qui. Quando si usa nei parametri ho disabilitato l'uso del secondo.

File:
BiforexV1.zip  161 kb
 
Aliaksei Karalkou:

L'intero codice? Sì, ora.

La linea 378 è la stessa stampa che, una volta abilitata, fa sì che l'EA non funzioni più.

Ho il sospetto che ci sia un errore nella formattazione del codice alle linee 221 e 223 . Nessuno usa la riproduzione della storia, non ci sono molti esempi, quindi questo potrebbe essere un errore. C'è un esempio su https://www.mql5.com/ru/code/7452 , ma è troppo complicato per me.
Ho escluso ladivisione per zero nella funzione Znomer(), linea 206.


Sto aspettando istruzioni e raccomandazioni. Grazie.

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));

L'eccesso((2*psd*usd)*((2*psd*usd)-C))/(C-1)) nella formula.

Al grado: ^0.5 non è *0.5

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

Se non c'è un solo commercio sul simbolo guardato attraverso e majik, o non c'è un solo profitto o perdita, o c'è solo una coppia (C=1), otterremo la divisione per 0.

Prima della formula stessa, dovreste controllare che psd e usd siano > 0, e C !=1

Le coppie redditizie sono calcolate con profitto > 1, perdita < 1, con profitto=1 non sono analizzate, cioè anche 1 deve essere incluso da qualche parte in questo o quel gruppo.

Nella tua funzione, sarebbe meglio selezionare prima i numeri di transazione che corrispondono al simbolo e al numero magico e poi controllare se il loro numero è cambiato, se sì - ricalcolare zn, se no - restituire zn (zn in questo caso non si azzera e il controllo != 0 non sarà necessario quando si stampa)

Il gufo smette di funzionare, perché si basa sulle variabili ww e nn, e quando la tua funzione funziona, queste cambiano e rompono l'algoritmo del gufo.

Niente sarebbe stato compilato se ci fosse stato un errore di progettazione del codice.
Motivazione: