Quaisquer perguntas de recém-chegados sobre MQL4 e MQL5, ajuda e discussão sobre algoritmos e códigos - página 734

 

Outra pergunta então :-)

Antes de mover o marcador de preço, a posição horizontal é calculada através da largura atual da tela

 x=width -70;

Quando eu abro a barra lateral, o marcador se move para a direita além do limite da tela. Se eu apertar o botão de atualização no registro, posso ver o indicador funcionando, mas o marcador não volta, ele aparece apenas na segunda tentativa. Acontece que a OnCalculate não é chamada todas as vezes? Como fazer a função funcionar permanentemente?



 
psyman:

Outra pergunta então :-)

Antes de mover o marcador de preço, a posição horizontal é calculada através da largura atual da tela

Quando eu abro a barra lateral, o marcador se move para a direita além do limite da tela. Se eu apertar o botão de atualização no registro, posso ver o indicador funcionando, mas o marcador não volta, ele aparece apenas na segunda tentativa. Acontece que a OnCalculate não é chamada todas as vezes? Como fazer esta função funcionar sempre?

fazer enquetes e redesenhar noOnChartEvent - CHARTEVENT_CHART_CHANGE

 

Saudações. Você pode me dizer algo?

Se o indicador desenha setas no gráfico e as setas não são objetos, é possível obter os parâmetros de tal desenho do próprio gráfico ou de qualquer outra forma? Não consigo obter dados de tampões e até mesmo executar o indicador para testes normalmente

 
Andrey Sokolov:

Saudações. Você pode me dizer algo?

Se o indicador desenha setas no gráfico e as setas não são objetos, é possível obter os parâmetros de tal desenho do próprio gráfico ou de qualquer outra forma? Não consigo obter dados de tampões e até mesmo executar o indicador para testes normalmente

Você tem o código do indicador?

 
Alexey Viktorov:

Existe um código para o indicador?

não

Tentativas de obter dados a partir dele, e o próprio indicador, foram discutidos aqui

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

Estou estudando os exemplos no tutorial e um deles falha em compilar na linha

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

MQL5_PROGRAM_NAME' - não pode converter em mouse_2.mq5 29 52


 
Ilya Prozumentov :

Verifique a permissão de trabalho para um conselheiro. E onde está a saída na impressão? Este pedaço de código parece retornar algo, já que não há erros, então o problema está fora deste pedaço de código. Nesta peça, exceto que a divisão por 0 pode ocorrer

Código inteiro? Sim agora .

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

A linha 378 é a mesma impressão, quando habilitada, o EA não funciona mais.

Tenho a suspeita de que há um erro no design do código nas linhas 221 e 223 . Ninguém usa a enumeração do histórico, há poucos exemplos, então um erro é possível. Há um exemplo na página https://www.mql5.com/en/code/7452 , mas é muito complicado para mim lá.
Divisão por zero na função Znomer(), linha 206, excluí.


Aguardo instruções e recomendações. Obrigada.

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

não

Tentativas de obter dados a partir dele, e o próprio indicador, foram discutidos aqui

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

Desculpe, eu não executo o .dll no meu computador por uma questão de princípio, vá em frente sem mim.
 
Alexey Viktorov:
Desculpe, eu não executo o .dll no meu computador por uma questão de princípio, vá em frente sem mim.

Apenas os indicadores aqui. Ao usar nos parâmetros eu desabilitei o uso do segundo.

Arquivos anexados:
BiforexV1.zip  161 kb
 
Aliaksei Karalkou:

O código completo? Sim, agora .

A linha 378 é a mesma impressão, o que, uma vez habilitada, faz com que a EA não funcione mais.

Suspeito que haja um erro na formatação do código nas linhas 221 e 223 . Ninguém usa a repetição da história, não há tantos exemplos, então isto pode ser um erro. Há um exemplo em https://www.mql5.com/ru/code/7452 , mas é muito complicado para mim.
Excluí adivisão por zero na função Znomer(), linha 206.


Estou esperando por instruções e recomendações. Obrigado.

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

O excesso((2*psd*usd)*((2*psd*usd)-C))/(C-1)) na fórmula.

Até o grau: ^0,5 não é *0,5

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

Se não houver um único comércio sobre o símbolo e majik, ou não houver um único lucro ou perda, ou houver apenas um par (C=1), obteremos a divisão por 0.

Antes da fórmula em si, você deve verificar se psd e usd são > 0, e C !=1

Os pares rentáveis são calculados com lucro > 1, perda < 1, com lucro=1 não são analisados, ou seja, 1 também tem que ser incluído em algum lugar neste ou naquele grupo.

Em sua função, seria melhor primeiro selecionar números de transação correspondentes ao símbolo e ao número mágico e depois verificar se o número deles mudou, se sim - recalcular zn, se não - retornar zn (zn neste caso não zerar e verificar != 0 não será necessário ao imprimir)

A coruja deixa de funcionar, porque depende das variáveis ww e nn, e quando sua função funciona, elas mudam e bagunçam o algoritmo da coruja.

Nada teria sido compilado se tivesse havido um erro de projeto de código.
Razão: