MQL5: Validación :-( Ya me he devanado los sesos para saber qué es y cómo se soluciona. - página 4

 
El código fue eliminado.
 
Andrey Minaev:
He leído lo que se comprueba para pasar. ¿Por qué escribes esto a todo el mundo? Tengo una pregunta sobre el volumen, lo que está mal.

Leer y hacer son dos grandes diferencias.

El método de tratamiento: además de leer, haz lo que está escrito. Repítelo hasta que entiendas el error.


Añadido: Al código de estudioIntersection 2 iMA Choosing Strategies, funciones OpenBuy, OpenSell, LotCheck.

Intersection 2 iMA Choosing Strategies
Intersection 2 iMA Choosing Strategies
  • www.mql5.com
На баре может быть только одна сделка 'вход в рынок' (это внутренний параметр, он не вынесен во входные параметры и это не имеет отношения к параметру ' Only one positions'). При работе в режиме 'внутри бара' ('Search signals, in seconds' больше или равно '10') текущий бар - бар #0, при работе в режиме 'только в момент рождения нового бара'...
 

Como te entiendo, pregunto por los lotes, me aconsejas que mire la normalización de los precios.

Ya he gastado mucho tiempo, no puedo entender lo que está mal. He hecho lo que escriben. Resulta que aquí tampoco saben cómo ayudar.

¿Qué hacer?

 
Andrey Minaev:

Como te entiendo, pregunto por los lotes, me aconsejas que mire la normalización de los precios.

Ya he pasado mucho tiempo, no puedo entender de qué se trata. He hecho lo que escriben. Resulta que aquí tampoco saben cómo ayudar.

¿Qué hacer?

Foro sobre comercio, sistemas de comercio automatizados y pruebas de estrategias

MQL5: Validación :-( Ya me he buscado en la cabeza a fondo qué es y cómo se soluciona.

Vladimir Karputov, 2020.03.10 18:36

Has leído y ejecutado - son dos grandes diferencias.

Su método de tratamiento: Haga lo que lee, pero también lea lo que está escrito. Repítelo hasta que entiendas el error.


Añadido: al código de estudioIntersection 2 iMA Choosing Strategies, funciones OpenBuy, OpenSell, LotCheck.

Puse la normalización de precios por error - lo siento.
 

He insertado su función LotCheck.

Este es el resultado

 

¿Alguien puede ayudar? Ya lo he intentado todo.

 
Andrey Minaev:

¿Alguien puede ayudar? Lo he intentado todo.

¿Dónde está el código? Pegue el código con el botónCódigo

 
//+-----------------------------------------------------------------------------------------------+
//| Функция открывает позицию Sell                                                                |
//+-----------------------------------------------------------------------------------------------+
void OpenSell(void)
{
   double volume=CalculateVolume(ORDER_TYPE_SELL);
   //volume=CheckVolumeValue(volume);
   //volume=NormalizeDouble(volume,DigitsLots());
   volume=LotCheck(volume,symb);
   if(!CheckMoneyForTrade(volume,ORDER_TYPE_BUY))
   {
      sell.allowOpen=false;
      return;
   }
   if(volume==0)
   {
      sell.allowOpen=false;
      return;
   }
   if(trd.Sell(volume,symb.Name(),symb.Bid(),0,0,inpComment))
//+-----------------------------------------------------------------------------------------------+
//| Функция рассчитывает объем позиции                                                            |
//+-----------------------------------------------------------------------------------------------+
double CalculateVolume(ENUM_ORDER_TYPE type)
{
   double volume=0;
   
   double size=cndl.high-cndl.low;
   
   if(symb.Point()==0)
      return 0;
   
   double sl=(size*inpStopLoss*0.01)/symb.Point();
   double risk=AccountInfoDouble(ACCOUNT_BALANCE)*inpRisk*0.01;
   
   volume=(risk/sl)/symb.TickValue();
   
   if(sl==0 || symb.TickValue()==0)
      return 0;
   
   if(inpMaxVolume>0 && inpMaxVolume<volume)
   {
      volume=inpMaxVolume;
      //Print(STR_TIME,"Установлен максимальный объем установленный в настройках");
      //Print(STR_TIME,"The maximum volume set in the settings is set");
   }
   return volume;
}
double LotCheck(double lots,CSymbolInfo &symbol)
  {
//--- calculate maximum volume
   double volume=NormalizeDouble(lots,2);
   double stepvol=symbol.LotsStep();
   if(stepvol>0.0)
      volume=stepvol*MathFloor(volume/stepvol);
//---
   double minvol=symbol.LotsMin();
   if(volume<minvol)
      volume=0.0;
//---
   double maxvol=symbol.LotsMax();
   if(volume>maxvol)
      volume=maxvol;
   return(volume);
  }
 
bool CheckMoneyForTrade(double lots,ENUM_ORDER_TYPE type)
  {
//--- получим цену открытия
   MqlTick mqltick;
   SymbolInfoTick(symb.Name(),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.Name(),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.Name()," Error code=",GetLastError());
      return(false);
     }
//--- проверка прошла успешно
   return(true);
  }
 
Andrey Minaev:

¿Alguien puede ayudar? Ya lo he intentado todo.

¿Cómo se cierran las posiciones?