Cualquier pregunta de los recién llegados sobre MQL4 y MQL5, ayuda y discusión sobre algoritmos y códigos - página 7

 
Hola! No he podido encontrar un hilo sobre la actualización del terminal Metatrader 4 para Android 2.3, así que por favor no me pateéis mucho por publicar en este hilo. En el mercado el terminal es sólo para Android 4+. Dónde puedo actualizar, porque el mío dejó de funcionar.
 
k19alex69:
Hola, no he encontrado un hilo sobre la actualización del terminal Metatrader 4 para Android 2.3, así que por favor no me pateéis mucho por publicar en este hilo. En el terminal del mercado sólo para Android 4+. Dónde puedo conseguir una actualización, porque la mía dejó de funcionar.

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

Terminal mt5 y mt4 no funciona

Renat Fatkhullin, 2016.11.13 23:51

Lo sentimos, ya no somos compatibles con las versiones de Android inferiores a la 4.0.3

 
Sergey Basov:

No tengo nada que explicar allí para que nadie responda. El gráfico que has mostrado no tiene sentido y es un misterio cómo se ha obtenido.

La opción "Superficie bidimensional" en la pestaña "Gráfico de optimización" del probador tiene sentido (en mi opinión) cuando es necesario optimizar 2 parámetros de entrada de un EA, o para ver visualmente a qué valores de 2 parámetros en el historial se obtuvieron buenos resultados, si estos parámetros son interdependientes, y si tienen algún sentido.

Por alguna razón sólo tienes 0 en ambos ejes, y verticalmente estos 0 están divididos en 3 pasos intermedios, por lo que tienes "cubos uno en el centro, dos más abajo/arriba, y dos/tres en un cuadrado". Y los resultados parecen aleatorios: los "cubos" blancos y verdes están dispersos al azar. Así que el gráfico no tiene sentido y no parece significar nada.

El gráfico puede no tener sentido, pero después de la optimización en el período de 2014-2015 y al seleccionar y establecer mejores parámetros y volver a probar desde 2014 hasta hoy, el resultado de la pérdida / drawdown permanecen sin cambios, bueno, el beneficio aumenta en proporción al período. Además, el bot estuvo trabajando en una demo durante un mes, y durante las pruebas del último mes con los parámetros por defecto todos los tratos coinciden con el probador = +5pp. Así que no voy a jugar con los cubos y su color.

Gracias por la aclaración.

 
¡Hola!
Estoy tratando de aprender MQL4 y por lo tanto por favor no se sienta mal por mi pregunta.
Por favor, indique cómo calcular correctamente el SL y el TP para una orden pendiente, en caso de que se coloque no en el precio actual sino en el precio obtenido durante los cálculos.
Deben calcularse en función de la longitud de la vela. Es aproximadamente así:
TP=NormalizarDoble(((iOpen(NULL,0,1))-(iLow(NULL,0,1)))*KoefTP*Punto,Dígitos);
Gracias.
 
Viachaslau Baiko:
¡Hola!
Estoy tratando de aprender MQL4, así que por favor no te sientas mal por mi pregunta.
Por favor, indique cómo calcular correctamente el SL y el TP para una orden pendiente y si se coloca no al precio actual sino al precio obtenido durante los cálculos.
Deben calcularse en función de la longitud de la vela. Es aproximadamente así:
TP=NormalizarDoble(((iOpen(NULL,0,1))-(iLow(NULL,0,1)))*KoefTP*Punto,Dígitos);
Gracias.

Aquí están las funciones que calcularán las órdenes de stop correctas para cualquier tipo de orden:

//+------------------------------------------------------------------+
double CorrectStopLoss(string symbol_name,int op,double price_set,double stop_loss) {
   if(stop_loss==0) return(0);
   double pt=SymbolInfoDouble(symbol_name,SYMBOL_POINT);
   double price=(op==OP_BUY)?SymbolInfoDouble(symbol_name,SYMBOL_BID):(op==OP_SELL)?SymbolInfoDouble(symbol_name,SYMBOL_ASK):price_set;
   int lv=StopLevel(symbol_name), dg=(int)SymbolInfoInteger(symbol_name,SYMBOL_DIGITS);
   if(op==OP_BUY || op==OP_BUYLIMIT || op==OP_BUYSTOP) return(NormalizeDouble(fmin(price-(lv+1)*pt,stop_loss),dg));
   else return(NormalizeDouble(fmax(price+(lv+1)*pt,stop_loss),dg));
}
//+------------------------------------------------------------------+
double CorrectStopLoss(string symbol_name,int op,double price_set,int stop_loss) {
   if(stop_loss==0) return(0);
   double pt=SymbolInfoDouble(symbol_name,SYMBOL_POINT);
   double price=(op==OP_BUY)?SymbolInfoDouble(symbol_name,SYMBOL_BID):(op==OP_SELL)?SymbolInfoDouble(symbol_name,SYMBOL_ASK):price_set;
   int lv=StopLevel(symbol_name), dg=(int)SymbolInfoInteger(symbol_name,SYMBOL_DIGITS);
   if(op==OP_BUY || op==OP_BUYLIMIT || op==OP_BUYSTOP) return(NormalizeDouble(fmin(price-(lv+1)*pt,price-stop_loss*pt),dg));
   else return(NormalizeDouble(fmax(price+(lv+1)*pt,price+stop_loss*pt),dg));
}
//+------------------------------------------------------------------+
double CorrectTakeProfit(string symbol_name,int op,double price_set,double take_profit) {
   if(take_profit==0) return(0);
   double pt=SymbolInfoDouble(symbol_name,SYMBOL_POINT);
   double price=(op==OP_BUY)?SymbolInfoDouble(symbol_name,SYMBOL_BID):(op==OP_SELL)?SymbolInfoDouble(symbol_name,SYMBOL_ASK):price_set;
   int lv=StopLevel(symbol_name), dg=(int)SymbolInfoInteger(symbol_name,SYMBOL_DIGITS);
   if(op==OP_BUY || op==OP_BUYLIMIT || op==OP_BUYSTOP) return(NormalizeDouble(fmax(price+(lv+1)*pt,take_profit),dg));
   else return(NormalizeDouble(fmin(price-(lv+1)*pt,take_profit),dg));
}
//+------------------------------------------------------------------+
double CorrectTakeProfit(string symbol_name,int op,double price_set,int take_profit) {
   if(take_profit==0) return(0);
   double pt=SymbolInfoDouble(symbol_name,SYMBOL_POINT);
   double price=(op==OP_BUY)?SymbolInfoDouble(symbol_name,SYMBOL_BID):(op==OP_SELL)?SymbolInfoDouble(symbol_name,SYMBOL_ASK):price_set;
   int lv=StopLevel(symbol_name), dg=(int)SymbolInfoInteger(symbol_name,SYMBOL_DIGITS);
   if(op==OP_BUY || op==OP_BUYLIMIT || op==OP_BUYSTOP) return(NormalizeDouble(fmax(price+(lv+1)*pt,price+take_profit*pt),dg));
   else return(NormalizeDouble(fmin(price-(lv+1)*pt,price-take_profit*pt),dg));
}
//+------------------------------------------------------------------+
int StopLevel(string symbol_name) {
   int sp=(int)SymbolInfoInteger(symbol_name,SYMBOL_SPREAD);
   int lv=(int)SymbolInfoInteger(symbol_name,SYMBOL_TRADE_STOPS_LEVEL);
   return((lv==0)?sp*2:lv);
   }
//+------------------------------------------------------------------+
 
void OnTick()
  {
//---
   MqlDateTime server_time;
   TimeToStruct(TimeCurrent(),server_time);
   //--- если значение минут серверного времени кратно заданному значению, в частности 20-ти минутам или равно 0
   if(server_time.min%minutesBefore==0 || server_time.min==0) {
      if(SignalByRSI(Symbol(),TimeframeRSI,minutesBefore)==OP_BUY) {
         //--- получили сигнал на покупку
         Print("Сигнал на покупку ",TimeCurrent());   // Проверочное сообщение в журнал
         //--- проверка наличия уже открытой позиции на покупку
         if (OrdersTotal() == 0)  
         {
         ticket=OrderSend(Symbol(),OP_BUY, Lts, Ask, 0, 0, 0, NULL, 1234, 0, Blue);  
         Alert ("Есть сигнал на покупку  ", sim, per);
         }
         if (OrdersTotal() >0)  
    
     if (OrderSelect(ticket, SELECT_BY_TICKET, MODE_TRADES))
     if(OrderType()==OP_SELL)
     {
     OrderClose(ticket, OrderLots(), Bid,0,Blue);
     {
     ticket=OrderSend(Symbol(),OP_BUY, Lts, Ask, 0, 0, 0, NULL, 1234, 0, Blue);
     Alert ("Есть сигнал на закрытие продажи и открытие покупки  ", sim, per);
     }
     }
    
    
         //--- вызов функции открытия позиции на покупку
         }
      if(SignalByRSI(Symbol(),TimeframeRSI,minutesBefore)==OP_SELL) {
         //--- получили сигнал на продажу
         Print("Сигнал на продажу ",TimeCurrent());   // Проверочное сообщение в журнал
         //--- проверка наличия уже открытой позиции на продажу
         if (OrdersTotal() == 0)  
         {
         ticket=OrderSend(Symbol(),OP_SELL, Lts, Bid, 0, 0, 0, NULL, 1234, 0, Red);
         Alert ("Есть сигнал на продажу  ", sim, per);
         }
         if (OrdersTotal() >0)  
    
     if (OrderSelect(ticket, SELECT_BY_TICKET, MODE_TRADES))
     if(OrderType()==OP_BUY)
     {
     OrderClose(ticket, OrderLots(), Ask,0,Red);
     {
     ticket=OrderSend(Symbol(),OP_SELL, Lts, Bid, 0, 0, 0, NULL, 1234, 0, Red);
     Alert ("Есть сигнал на закрытие покупки и открытие продажи  ", sim, per);
     }
     }
         //--- вызов функции открытия позиции на продажу
         }
      }
  }
Un consejo. Necesito abrir un corto, por ejemplo. En caso de una señal de compra, cerrar el corto y abrir el largo.
 
Artyom Trishkin:

Aquí están las funciones que calcularán las órdenes de stop correctas para cualquier tipo de orden:

//+------------------------------------------------------------------+
double CorrectStopLoss(string symbol_name,int op,double price_set,double stop_loss) {
   if(stop_loss==0) return(0);
   double pt=SymbolInfoDouble(symbol_name,SYMBOL_POINT);
   double price=(op==OP_BUY)?SymbolInfoDouble(symbol_name,SYMBOL_BID):(op==OP_SELL)?SymbolInfoDouble(symbol_name,SYMBOL_ASK):price_set;
   int lv=StopLevel(symbol_name), dg=(int)SymbolInfoInteger(symbol_name,SYMBOL_DIGITS);
   if(op==OP_BUY || op==OP_BUYLIMIT || op==OP_BUYSTOP) return(NormalizeDouble(fmin(price-(lv+1)*pt,stop_loss),dg));
   else return(NormalizeDouble(fmax(price+(lv+1)*pt,stop_loss),dg));
}
//+------------------------------------------------------------------+
double CorrectStopLoss(string symbol_name,int op,double price_set,int stop_loss) {
   if(stop_loss==0) return(0);
   double pt=SymbolInfoDouble(symbol_name,SYMBOL_POINT);
   double price=(op==OP_BUY)?SymbolInfoDouble(symbol_name,SYMBOL_BID):(op==OP_SELL)?SymbolInfoDouble(symbol_name,SYMBOL_ASK):price_set;
   int lv=StopLevel(symbol_name), dg=(int)SymbolInfoInteger(symbol_name,SYMBOL_DIGITS);
   if(op==OP_BUY || op==OP_BUYLIMIT || op==OP_BUYSTOP) return(NormalizeDouble(fmin(price-(lv+1)*pt,price-stop_loss*pt),dg));
   else return(NormalizeDouble(fmax(price+(lv+1)*pt,price+stop_loss*pt),dg));
}
//+------------------------------------------------------------------+
double CorrectTakeProfit(string symbol_name,int op,double price_set,double take_profit) {
   if(take_profit==0) return(0);
   double pt=SymbolInfoDouble(symbol_name,SYMBOL_POINT);
   double price=(op==OP_BUY)?SymbolInfoDouble(symbol_name,SYMBOL_BID):(op==OP_SELL)?SymbolInfoDouble(symbol_name,SYMBOL_ASK):price_set;
   int lv=StopLevel(symbol_name), dg=(int)SymbolInfoInteger(symbol_name,SYMBOL_DIGITS);
   if(op==OP_BUY || op==OP_BUYLIMIT || op==OP_BUYSTOP) return(NormalizeDouble(fmax(price+(lv+1)*pt,take_profit),dg));
   else return(NormalizeDouble(fmin(price-(lv+1)*pt,take_profit),dg));
}
//+------------------------------------------------------------------+
double CorrectTakeProfit(string symbol_name,int op,double price_set,int take_profit) {
   if(take_profit==0) return(0);
   double pt=SymbolInfoDouble(symbol_name,SYMBOL_POINT);
   double price=(op==OP_BUY)?SymbolInfoDouble(symbol_name,SYMBOL_BID):(op==OP_SELL)?SymbolInfoDouble(symbol_name,SYMBOL_ASK):price_set;
   int lv=StopLevel(symbol_name), dg=(int)SymbolInfoInteger(symbol_name,SYMBOL_DIGITS);
   if(op==OP_BUY || op==OP_BUYLIMIT || op==OP_BUYSTOP) return(NormalizeDouble(fmax(price+(lv+1)*pt,price+take_profit*pt),dg));
   else return(NormalizeDouble(fmin(price-(lv+1)*pt,price-take_profit*pt),dg));
}
//+------------------------------------------------------------------+
int StopLevel(string symbol_name) {
   int sp=(int)SymbolInfoInteger(symbol_name,SYMBOL_SPREAD);
   int lv=(int)SymbolInfoInteger(symbol_name,SYMBOL_TRADE_STOPS_LEVEL);
   return((lv==0)?sp*2:lv);
   }
//+------------------------------------------------------------------+
Gracias, Artem. Lo investigaré.
 
Viachaslau Baiko:
Gracias, Artem, lo investigaré.

De nada. Siempre que necesite obtener precios stop precisos, conociendo el precio de apertura de una orden de mercado o pendiente, obtenga los precios requeridos con estas funciones - devolverán precios ya calculados para la orden stop requerida.

Suponga que tiene el precio establecido de una orden pendiente:
double priseSet=1.12345;
Entonces el precio de stop loss
int StopLoss=20; puntos para BuyLimit será:
double sl=CorrectStopLoss(Symbol(),OP_BUYLIMIT,priceSet,StopLoss);

La variable sl tomará el stop loss correctamente calculado para BuyLimit con los requisitos de StopLevel.

 
strongflex:
Aquí tienes un consejo. Supongamos que se abre una posición corta. En caso de una señal de compra, cerrar el corto y abrir el largo.

Compruebe si hay una posición de venta abierta. Si es así, ciérralo.

Entonces abra una posición de compra.

Es elemental.

 

Tengo un gran deseo de utilizar mql4 para implementar dicho algoritmo:

Hay dos terminales MT4 de diferentes brokers. En uno de ellos hay un indicador de "exclusividad", que no se puede mover a otro terminal (como en Market).

¿Y qué? ¿Es posible tomar las lecturas de los búferes del indicador "exclusivo" e implementarlas en tu propio indicador en tu propio terminal?

Los recursos no funcionan de alguna manera.

Razón de la queja: