Preguntas de los principiantes MQL4 MT4 MetaTrader 4 - página 112

 
Николай Цепелев:

Hola. Escribí en mi EA el cálculo del lote así:

lote=NormalizeDouble(AccountBalance()*riesgo/(SL*MarketInfo(Symbol(),MODE_TICKVALUE)),2);

El propósito es obtener el tamaño de lote correcto independientemente de la divisa y el par de la cuenta para el riesgo y el stop loss dados. Elriesgo se establece como un porcentaje de pérdidas cuando se activa el Stop Loss. Stop Loss SL en pips (donde pips es el menor cambio posible del precio del par). Voy a utilizar este EA en la cuenta real. Pero tengo mis dudas. Si alguien de los programadores más experimentados pudiera decirme qué errores pueden producirse, se lo agradecería mucho.
Probador de estrategias primero. Entonces tenemos una cuenta de demostración. Y sólo entonces la cuenta real. Para comprobar la fórmula, escribe un script. O simplemente calcularlo en un papel. Tomé balance=100, riesgo=0.1 SL=100, Tick=0.00001 Lote=100*0.1 / (100*0.00001) = 10 / 0.001 = 10000 lote más que el balance? ¿Debemos considerar el apalancamiento?
 
STARIJ:
Primer probador de estrategias. Entonces, una cuenta de demostración. Y sólo entonces uno de verdad. Para comprobar la fórmula, escribe un script. O simplemente calcularlo en un papel. Tomé balance=100, riesgo=0.1 SL=100, Tick=0.00001 Lote=100*0.1 / (100*0.00001) = 10 / 0.001 = 10000 lote más que el balance? ¿Debemos considerar el apalancamiento?

MarketInfo(Symbol(),MODE_TICKVALUE)) no devuelve el tamaño mínimo del tick. Está escrito en la ayuda:

Tamaño del cambio mínimo del precio del instrumento en la moneda del depósito.


Pero en realidad, devuelve el valor del cambio mínimo del precio del símbolo en la moneda de depósito de 1 lote del contrato.


En su ejemplo,MarketInfo(Symbol(),MODE_TICKVALUE)) devolverá 1. Y entonces todo es correcto. Lo he probado en cuentas reales de dólares y rublos y funciona. Aquí está el script que utilicé para comprobarlo:

#property copyright "Copyright 2016, MetaQuotes Software Corp.

#enlace de propiedad "https://www.mql5.com"

#versión de la propiedad "1.00"

#propiedad estricta

#property show_inputs

extern double risk=0.10;

extern int sl=1000;

//+------------------------------------------------------------------+

//| Función de inicio del programa de script |

//+------------------------------------------------------------------+

void OnStart()

{

Alert(NormalizeDouble(AccountBalance()*risk/(sl*MarketInfo(Symbol(),MODE_TICKVALUE),2))

}

//+------------------------------------------------------------------+

Открой новые возможности в MetaTrader 5 с сообществом и сервисами MQL5
Открой новые возможности в MetaTrader 5 с сообществом и сервисами MQL5
  • www.mql5.com
Задавайте вопросы по техническому анализу, обсуждайте торговые системы и улучшайте свои навыки программирования торговых стратегий на языке MQL5. Общайтесь и обменивайтесь опытом на форуме с трейдерами всего мира и помогайте ответами новичкам — наше сообщество развивается вместе с вами. Библиотеки: Black or White Text Black or White Text...
 

Tienes razón. La comprobación con un script es más rápida y fiable

//+------------------------------------------------------------------+ 
//| Расчет лота                                                      | 
//+------------------------------------------------------------------+ 
#property strict
#property show_inputs
extern double risk=0.10;
extern int    sl  =100;
void OnStart() 
{ 
   Alert(MarketInfo(Symbol(),MODE_TICKVALUE), "   ",NormalizeDouble(AccountBalance()*risk/(sl*MarketInfo(Symbol(),MODE_TICKVALUE)),2));
}
 
Николай Цепелев:
Tu guión ocupa 19 cm de altura en la pantalla, el mío tiene 8,1 cm, la mitad. Y el color es diferente
 

También tenemos que hacer que la precisión en la función NormaliseDouble dependa del lote mínimo permitido. Si se pasa un lote a la función OrderSend, por ejemplo, 0,11, y la herramienta sólo opera con lotes múltiples de 0,1, se producirá un error.

 

No puedo entender por qué las operaciones abiertas no se borran todas a la vez, es decir, el EA borra algunas de ellas, pero el error orderdelete 4108, la orden de mercado no se puede borrar varias veces, y sólo entonces las borra.

  int start()                                     
  {
  
  while(!IsStopped())     
      {               

Refreshrates();

  
   if(cont==true&&NormalizeDouble(AccountProfit(),2)>=0)
    {
     for(i=1; i<=OrdersTotal(); i++)       
        { RefreshRates(); 
         if(OrderSelect(i-1,SELECT_BY_POS)==true
           {                                    
              while(OrderType()==OP_BUYLIMIT) 
              {
               res=false;
               res=OrderDelete(OrderTicket());
               if(res==true)
               break;
               }
              while(OrderType()==OP_BUY)
              {
               res=false;
               res=OrderClose(OrderTicket(),OrderLots(),MarketInfo(Symb,MODE_BID),Slippage);  
               if(res==true)
               break;
              }
              while(OrderType()==OP_SELLLIMIT) 
              {
               res=false;
               res=OrderDelete(OrderTicket());
               if(res==true)
               break;
              }
              while(OrderType()==OP_SELL)
              {
               res=false;     
               res=OrderClose(OrderTicket(),OrderLots(),MarketInfo(Symb,MODE_ASK),Slippage);
               if(res==true)
               break;
              }     
           }  
         }
}
}  
 
Yevgen Butov:

No puedo entender por qué las operaciones abiertas no se borran todas a la vez, es decir, el EA borra algunas de ellas, pero el error orderdelete 4108, la orden de mercado no se puede borrar varias veces, y sólo entonces las borra.

En esta página se explica cómo eliminar. Tienes dos errores.

 
Buenas tardes. Estoy pidiendo ayuda. He buscado en la RED y en el foro. Estoy probando el Asesor Experto en modo estándar, todo está bien... No hay errores ni advertencias. He descargado los datos de las garrapatas y he añadido. (Hice todo como se describe aquí - Cómo probar Asesores Expertos con un 99% de calidad - fácil, gratis, legal) y aquí - "Cómo conseguir una calidad de simulación del 99% en el Probador de Estrategias de Metatrader 4") En el arranque se produce constantemente el error 'array out of range in 'expert1.0.mq4' (69,25)... Entiendo que se trata de una matriz. No sé qué hacer. Pero como todo está bien en el modo estándar... Por favor, ayuda
 
qroner:
En el arranque hay un error constante array out of range en 'expert1.0.mq4' (69,25)... He entendido que se trata de la matriz. No sé qué hacer.

Necesito ver el código, o una parte de él, que maneja esta matriz.

Telépatas, descansen hoy.

 
Konstantin Nikitin:

Tienes que mirar el código o un trozo de código que maneja el array.

Telépatas, descansen hoy.

void Uchet_Orderov_Function(string _Simvol, int _Magic, int &_Mas[8]){
ArrayInitialize(_Mas, 0);
int Ticket=-1;
for(int pos=OrdersTotal()-1; pos>=0; pos--){
if(OrderSelect(pos,SELECT_BY_POS,MODE_TRADES) && OrderSymbol()==_Simvol&&
OrderMagicNumber()==_Magic && OrderTicket()!=Ticket){
Ticket=OrderTicket();
switch(OrderType()){
case 0:{_Mas[0]++;_Mas[6]++;break;}
case 1:{_Mas[1]++;_Mas[6]++;break;}
case 2:{_Mas[2]++;_Mas[7]++;break;}
case 3:{_Mas[3]++;_Mas[7]++;break;}
case 4:{_Mas[4]++;_Mas[7]++;break;}
case 5:{_Mas[5]++;_Mas[7]++;break;}
}
}
}

}

Esta es la función.

Sólo pensé que el problema no estaba en el código, ya que no hay errores en el modo estándar.

Razón de la queja: