Validatore automatico - problemi

 

Cerco di aggiornare la versione EA e ottengo un errore.

Lo stesso EA è nel tester di strategia.


Sto anche scrivendo EAs per MT4 allo stesso tempo, tutto è OK lì. Il codice per gli EA 4 e 5 è lo stesso, l'unica differenza è il file include (sono diversi per 4 e 5).

L'ultima volta che ho aggiornato questo EA, è stato a gennaio e tutto era a posto.

Versione del software - MetaTrader 5 x64 build 2025 avviato (MetaQuotes Software Corp.)

- Terminale Windows 10 (build 14393) x64, IE 11, UAC, Intel Celeron N2815 @ 1.86GHz, Memoria: 1866 / 3967 Mb, Disco: 5 / 35 Gb, GMT+3

 
Uladzimir Kirychenka:

Cerco di aggiornare la versione EA e ottengo un errore.

Lo stesso EA è nel tester di strategia.


Sto anche scrivendo EAs per MT4 allo stesso tempo, tutto è OK lì. Il codice per gli EA 4 e 5 è lo stesso, l'unica differenza è il file include (sono diversi per 4 e 5).

L'ultima volta che ho aggiornato questo EA, è stato a gennaio e tutto era a posto.

Versione del software - MetaTrader 5 x64 build 2025 avviato (MetaQuotes Software Corp.)

- Terminale Windows 10 (build 14393) x64, IE 11, UAC, Intel Celeron N2815 @ 1.86GHz, Memoria: 1866 / 3967 Mb, Disco: 5 / 35 Gb, GMT+3

Fai finta di essere un idiota e metti un deposito di 1$ o un lotto di 100500 e vedi se ci saranno dei trade. E ci saranno avvisi che solo un idiota avrebbe impostato tali parametri.

 
Alexey Viktorov:

Fai finta di essere un idiota e metti un deposito di 1$ o lotto 100500 e controlla se ci saranno scambi. E se ci saranno avvisi che solo un idiota può impostare tali parametri.

Lo stesso problema. Provato - non aiuta ). Non posso aggiornare dal 13 aprile. Se controllo tutto e tutto - ottengo solo una scritta su tutti i simboli "trehe are no trading operations". Se non controllo tutto ottengo un errore - non c'è abbastanza capitale per aprire la posizione. La versione per MT4, così come per l'autore di TS aggiornato senza problemi.

123

Vedrei nella foto che il lotto minimo è 2000, il saldo è 10000 e ovviamente non ci sono abbastanza soldi per aprire la posizione. Non passo comunque il controllo.

Cosa fare in questi casi?

 

Naturalmente non ci saranno accordi. E quali dovrebbero essere gli allarmi? Ho solo in OnInit se la dimensione del lotto non è nell'intervallo SYMBOL_VOLUME_MIN e SYMBOL_VOLUME_MAX, allora errore di inizializzazione INIT_PARAMETERS_INCORRECT

 
Uladzimir Kirychenka:

Naturalmente non ci saranno accordi. E quali dovrebbero essere gli allarmi? Ho solo in OnInit se la dimensione del lotto non è nell'intervallo SYMBOL_VOLUME_MIN e SYMBOL_VOLUME_MAX, allora errore di inizializzazione INIT_PARAMETERS_INCORRECT

Ricordo che avevo circa la stessa cosa allora con i moderatori che controllavano dopo l'autocontrollo. In caso di parametri errati, OnInit termina anche con il codice INIT_PARAMETERS_INCORRECT. E l'auto-check ha generato lo stesso errore che non c'era nessuna operazione commerciale. Così, il moderatore mi ha consigliato di non terminare OnInit() con questo codice, ma di emettere un Alert.

 

Probabilmente una volta al mese qualcuno lo tira fuori. Va avanti da un po' di tempo ormai.

Il fatto è che quando si fa trading (nella vita reale) non solo la dimensione del saldo può cambiare, ma anche la dimensione del lotto.

E durante i test la dimensione del deposito (da 1 a 10000000) o la dimensione del lotto (da 1000000 a 0.01) può variare.

Pertanto, questi controlli dovrebbero essere eseguiti non solo una volta a OnInit, ma permanentemente, nel ciclo (per esempio, in OnTick).

Per evitare l'overflow del log, è necessario emettere l'avviso(Print Message o Alert) solo una volta.

 
Uladzimir Kirychenka:

Naturalmente non ci saranno accordi. E quali dovrebbero essere gli allarmi? Ho solo in OnInit se la dimensione del lotto non è nell'intervallo SYMBOL_VOLUME_MIN e SYMBOL_VOLUME_MAX, allora errore di inizializzazione INIT_PARAMETERS_INCORRECT

Capisco che è molto difficile fingere di essere un idiota, ma questa abilità a volte aiuta. Prova di nuovo. Si imposta un EA, con $1 sul conto, si imposta un lotto di 100500 e si aspetta... Aspetti un giorno, un secondo, un terzo... poi cominci a risentirti: "Per cosa ho pagato. Perché questa merda non funziona?" e nessuno dice niente, nessuno vuole dire qualcosa come "Sei un idiota... Non si può lavorare nel mercato Forex con un tale deposito. Solo un idiota metterebbe un lotto 100500"... Le cose stanno così.

 
Petros Shatakhtsyan:

Probabilmente una volta al mese qualcuno lo tira fuori. Va avanti da un po' di tempo ormai.

Il fatto è che quando si fa trading (nella vita reale) non solo la dimensione del saldo può cambiare, ma anche la dimensione del lotto.

E durante i test la dimensione del deposito (da 1 a 10000000) o la dimensione del lotto (da 1000000 a 0.01) può variare.

Pertanto, questi controlli dovrebbero essere eseguiti non solo una volta a OnInit, ma permanentemente, nel ciclo (per esempio, in OnTick).

L'avviso (Print Message o Alert) deve essere stampato solo una volta per evitare l'overflow del registro.

Anche un codice molto semplice non può passare la convalida. Sembra soddisfare le condizioni che menzionate.

void OnTick()
  {
   ENUM_POSITION_TYPE PosType=POSITION_TYPE_SELL;
   MqlTradeRequest request;
   MqlTradeResult result;
   MqlTradeCheckResult check;
   ZeroMemory(request);
   ZeroMemory(result);
   ZeroMemory(check);
   long digit;
   double point,Bid;
   SymbolInfoDouble(_Symbol,SYMBOL_BID,Bid);
   request.type   = ORDER_TYPE_SELL;
   request.price  = Bid;
   request.action = TRADE_ACTION_DEAL;
   request.symbol = _Symbol;
   request.volume = SymbolInfoDouble(_Symbol,SYMBOL_VOLUME_MIN);
   request.sl=0;
   request.tp=0;
   request.deviation=10;
   request.magic=55555;
   request.comment=NULL;
   request.type_filling=0;
   if(PositionsTotal()==0
   &&CheckMoneyForTrade(_Symbol,SymbolInfoDouble(_Symbol,SYMBOL_VOLUME_MIN),ORDER_TYPE_SELL)==true
   ){
   OrderSend(request,result);
   }else{
      ExtExpert.Deinit();
      return;
   }
  }
  bool CheckMoneyForTrade(string symb,double lots,ENUM_ORDER_TYPE type)
  {
//--- получим цену открытия
   MqlTick mqltick;
   SymbolInfoTick(symb,mqltick);
   double price=mqltick.ask;
   if(type==ORDER_TYPE_SELL)
      price=mqltick.bid;
//--- значения необходимой и свободной маржи
   double margin,free_margin=AccountInfoDouble(ACCOUNT_MARGIN_FREE);
   //--- вызовем функцию проверки
   if(!OrderCalcMargin(type,symb,lots,price,margin))
     {
      //--- что-то пошло не так, сообщим и вернем false
      Print("Error in ",__FUNCTION__," code=",GetLastError());
      return(false);
     }
   //--- если не хватает средств на проведение операции
   if(margin>free_margin)
     {
      //--- сообщим об ошибке и вернем false
      Print("Not enough money for ",EnumToString(type)," ",lots," ",symb," Error code=",GetLastError());
      return(false);
     }
//--- проверка прошла успешно
   return(true);
  }
con il controllo dei soldi - non ci sono operazioni commerciali, senza controllo - non ci sono abbastanza soldi
 
Petros Shatakhtsyan:

Probabilmente una volta al mese qualcuno lo tira fuori. Va avanti da un po' di tempo ormai.

Il fatto è che quando si fa trading (nella vita reale) non solo la dimensione del saldo può cambiare, ma anche la dimensione del lotto.

E durante i test la dimensione del deposito (da 1 a 10000000) o la dimensione del lotto (da 1000000 a 0.01) può variare.

Pertanto, questi controlli dovrebbero essere eseguiti non solo una volta a OnInit, ma permanentemente, nel ciclo (per esempio, in OnTick).

L'avviso (Print Message o Alert) deve essere emesso solo una volta per evitare l'overflow del registro.

Questi controlli (LotMin, LotMax, LotNormalizeStep, check balance, OrderCheck) vengono eseguiti ogni volta che viene aperta una posizione. E il controllo del lotto solo in OnInit. Non conosco la logica del controllo del saldo in OnInit.

PS: Alert non mi salva dagli errori del validatore ((((((((((

 
Uladzimir Kirychenka:

Questi controlli (LotMin, LotMax, LotNormalizeStep, check balance, OrderCheck) vengono eseguiti ogni volta che viene aperta una posizione. E onInit controlla solo il lotto. Non conosco la logica del controllo del saldo in OnInit.

PS: Alert non salva dagli errori del validatore ((((((((((

Il validatore non ha errori :)

Il validatore mostra solo che nel codice fornito

  • non ci sono controlli completi
  • non c'è gestione degli errori
Il validatore mostra che il cosiddetto scrittore di codice non si è mai messo al posto dell'utente.

 
Vladimir Karputov:

Il validatore non ha errori :)

Il validatore mostra solo che il codice fornito

  • non ci sono controlli completi
  • Non c'è gestione degli errori
Il validatore mostra che il cosiddetto scrittore di codice non si è mai messo nei panni dell'utente.

))