Bibliotecas: MT4Orders - página 78

 
Aleksey Vyazmikin #:

Hice que el manejo de errores en mi clase funcionara así

Al final de mi clase he añadido una función

No es una mala variante. Sólo recuerda que otros códigos de error no estarán disponibles.

Документация по MQL5: Константы, перечисления и структуры / Коды ошибок и предупреждений / Ошибки времени выполнения
Документация по MQL5: Константы, перечисления и структуры / Коды ошибок и предупреждений / Ошибки времени выполнения
  • www.mql5.com
Ошибки времени выполнения - Коды ошибок и предупреждений - Константы, перечисления и структуры - Справочник MQL5 - Справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5
 
fxsaber #:

No es una mala opción. Sólo recuerde que otros códigos de error no estarán disponibles.

Creo que este cambio sólo es válido para el código alrededor de mi clase, y después de eso desactivo la sustitución #undef GetLastError y, si lo he entendido bien, el compilador ya no sustituirá GetLastError, ¿o me equivoco?

 
Aleksey Vyazmikin #:

Parece que este cambio sólo es válido para el código alrededor de mi clase, y después de desactivar la sustitución #undef GetLastError y, si he entendido bien, el compilador no sustituirá GetLastError más, ¿o me equivoco?

Tienes razón. No entendí lo que querías decir a la primera.

 
fxsaber #:

Tiene usted razón. No me di cuenta inmediatamente de lo que quería decir.

Gracias. Ahora sólo tengo que probarlo :)

 

Puede ayudar a descifrar la función, porque todos estos dos puntos y signos de interrogación - No entiendo.

//+------------------------------------------------------------------+
//||
//+------------------------------------------------------------------+
double AccountFreeMarginCheck(const string Symb,const int Cmd,const double dVolume)
  {
   double Margin;

   return(::OrderCalcMargin((ENUM_ORDER_TYPE)Cmd, Symb, dVolume,
          ::SymbolInfoDouble(Symb,(Cmd==::ORDER_TYPE_BUY) ? ::SYMBOL_ASK : ::SYMBOL_BID),Margin) ?
          ::AccountInfoDouble(::ACCOUNT_MARGIN_FREE) - Margin : -1);
  }

Devuelve un valor menor que cero, con el dinero 9k apalancamiento 1k100 lote 0,01 - ¿qué está mal?

 

Imprimir la información en el registro

/+------------------------------------------------------------------+
//|Comprueba si hay dinero suficiente para abrir una orden
//+------------------------------------------------------------------+ 
bool CheckMoneyForTrade(double lots,int type)
  {
   string symb=Symbol();
   double free_margin=AccountFreeMarginCheck(symb,type,lots);

   double MarginAsk=0.0;
   bool MarginAskB=OrderCalcMargin(ENUM_ORDER_TYPE(type),Symbol(),lots,SymbolInfoDouble(Symbol(),SYMBOL_ASK),MarginAsk);
   double MarginBid=0.0;
   bool MarginBidB=OrderCalcMargin(ENUM_ORDER_TYPE(type),Symbol(),lots,SymbolInfoDouble(Symbol(),SYMBOL_BID),MarginBid);
   
   Print("ACCOUNT_MARGIN_FREE=",AccountInfoDouble(ACCOUNT_MARGIN_FREE),
   " SYMBOL_ASK=",SymbolInfoDouble(Symbol(),SYMBOL_ASK),
   " SYMBOL_BID=",SymbolInfoDouble(Symbol(),SYMBOL_BID),
   " OrderCalcMarginAsk=",MarginAsk,
   " OrderCalcMarginBid=",MarginBid, 
   " free_margin=",free_margin 
   );


   //-- si no hay suficiente dinero
   if(free_margin<0)
     {
      string oper=(type==OP_BUY)? "Buy":"Sell";
      Print("Not enough money for ", oper," ",lots, " ", symb, " Error code=",GetLastError());
      return(false);
     }
     if(NewOrderAllowedVolume(Symbol())<(lots+0.1))return(false);//Comprobar la capacidad disponible
  
   //-- la prueba se ha realizado correctamente
   return(true);
  }

En el comprobador:

2022.07.22 21:50:39.521 2009.12.04 14:30:00   ACCOUNT_MARGIN_FREE=999560.05 SYMBOL_ASK=89.63 SYMBOL_BID=89.6 OrderCalcMarginAsk=100.0 OrderCalcMarginBid=100.0 free_margin=999460.05

En la vida real:

2022.07.22 21:45:08.956 Bingo_MT5 (USDJPY,M15)  ACCOUNT_MARGIN_FREE=9000.0 SYMBOL_ASK=136.267 SYMBOL_BID=136.241 OrderCalcMarginAsk=0.0 OrderCalcMarginBid=0.0 free_margin=-1.0
2022.07.22 21:45:08.956 Bingo_MT5 (USDJPY,M15)  Not enough money for Buy 0.0 USDJPY Error code=4002

Parece que el cálculo no se produce OrderCalcMargin() por razones desconocidas - ¿alguna idea?

El error 4002 significa:

Parámetro erróneo en la llamada interna de la función terminal del cliente

Pero lo que significa no está claro....

 
Aleksey Vyazmikin #:

¿Puede ayudar a descifrar la función, porque todos estos dos puntos y signos de interrogación - No entiendo.

Estás usando alguna solución antigua, montada a toda prisa.

Foro sobre trading, sistemas automatizados de trading y testeo de estrategias de trading.

Bibliotecas: MT4Orders

Aleksey Vyazmikin, 2022.07.21 11:58 AM

Hecho tan trabajar con errores en mi clase

#ifdef __MQL5__
#include <MQL4_To_MQL5.mqh> // https://www.mql5.com/es/code/16006
#endif // __MQL5__
Muchas veces lamentó que lo he publicado, ya que no tiene nada que ver con MT4Orders. Solo era un complemento a los ejemplos. No recuerdo el significado del mismo. No quiero entrar en ello.


Recordé que hice una solución más elaborada de "conversión" aquí.

Foro sobre trading, sistemas automatizados de trading y testeo de estrategias de trading

Bibliotecas: MT4Orders

fxsaber, 2019.01.13 17:23 PM.

Las funciones de Kim bajo MT4 son bastante populares, así que descargué todas las fuentes de su sitio y escribí un simple "convertidor" para ellas bajo MT5.
#include <KimIVToMT5.mqh> // https://c.mql5.com/3/263/KimIVToMT5.mqh

Yo mismo uso MT4Style sólo en funciones de Orden. Absolutamente no convierto otras funciones estándar de MT4 para mi trabajo y veo esta opción como una muleta. Recomiendo escribir funciones de margen sobre funciones nativas sin intentar convertirlas. Miré a mi clase sobre el trabajo con el margen - un tamaño decente mqh-archivo. Y esto es sólo para Forex regular.

 
fxsaber #:

Estás usando alguna solución antigua, montada a toda prisa.

Muchas veces me arrepentí de haberlo publicado, ya que no tiene nada que ver con MT4Orders. Era sólo un complemento a los ejemplos. No recuerdo su significado. No quiero investigarlo.


Me acordé de que hice una solución más elaborada de "conversión" aquí.

Yo mismo uso MT4Style sólo en funciones de Orden. Yo absolutamente no convertir otras funciones estándar MT4 para mi trabajo y ver esta opción como una muleta. Recomiendo escribir funciones de margen en funciones nativas sin tratar de convertirlos. Miré a mi clase sobre el trabajo con el margen - un tamaño decente mqh-archivo. Y esto es sólo para Forex regular.

Yo sólo tenía una tarea para hacer código compilable para MT4 y MT5 en las funciones de la lógica EA, y he convertido las cosas muy relacionadas con el medio ambiente y el trabajo con las órdenes con la ayuda de los inkludniks antes mencionados, o sacó funciones separadas y reelaborado para cada plataforma. El proyecto resultó ser grande, y su solución me ayudó mucho, gracias por su trabajo.

Tuve otro error - el tamaño mínimo del lote se determinó incorrectamente, así que añadí banderas aquí. Anteriormente hice el traversal sin tener en cuenta su código (MQL4_To_MQL5.mqh no es su código?) - compiló pero no funcionó correctamente.

#define  MODE_BID 9
#define  MODE_ASK 10
#define  MODE_DIGITS 12
#define MODE_SPREAD 13
#define  MODE_STOPLEVEL 14
#define  MODE_LOTSIZE 15

#define  MODE_POINT 11
#define  MODE_TICKVALUE 16
#define  MODE_TICKSIZE 17

#define  MODE_MAXLOT 18
#define  MODE_MINLOT 19
#define  MODE_LOTSTEP 20

//+------------------------------------------------------------------+
//||
//+------------------------------------------------------------------+
double MarketInfo(const string Symb,const int Type)
  {
   switch(Type)
     {
      case MODE_BID:
         return(::SymbolInfoDouble(Symb, ::SYMBOL_BID));
      case MODE_ASK:
         return(::SymbolInfoDouble(Symb, ::SYMBOL_ASK));
      case MODE_DIGITS:
         return((double)::SymbolInfoInteger(Symb, ::SYMBOL_DIGITS));
      case MODE_SPREAD:
         return((double)::SymbolInfoInteger(Symb, ::SYMBOL_SPREAD));
      case MODE_STOPLEVEL:
         return((double)::SymbolInfoInteger(Symb, ::SYMBOL_TRADE_STOPS_LEVEL));
      case MODE_LOTSIZE:
         return(::SymbolInfoDouble(Symb, ::SYMBOL_TRADE_CONTRACT_SIZE));

      case MODE_POINT:
         return(::SymbolInfoDouble(Symb, ::SYMBOL_POINT));
       case MODE_TICKVALUE:
         return(::SymbolInfoDouble(Symb, ::SYMBOL_TRADE_TICK_SIZE));
      case MODE_TICKSIZE:
         return(::SymbolInfoDouble(Symb, ::SYMBOL_TRADE_TICK_VALUE));                 
      case MODE_MAXLOT:
         return(::SymbolInfoDouble(Symb, ::SYMBOL_VOLUME_MAX));  
      case MODE_MINLOT:
         return(::SymbolInfoDouble(Symb, ::SYMBOL_VOLUME_MIN));  
      case MODE_LOTSTEP:
         return(::SymbolInfoDouble(Symb, ::SYMBOL_VOLUME_STEP));                    
     }

   return(-1);
  }
 
Aleksey Vyazmikin #:

¿o MQL4_To_MQL5.mqh no es su código?

Es mío, pero es bastante viejo. Es mejor mirar en mqh de Kim, hay una solución más elaborada para MarketInfo.

 
fxsaber #:

La mía, pero hace mucho tiempo. Es mejor mirar en mqh de kimov, allí en MarketInfo solución más reflexiva.

Gracias, voy a echar un vistazo, parece que funciona hasta ahora, voy a seguir probando.