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

 
Mihail Matkovskij #:

¿Cómo se calcula el tp?

Especifico en la variable doble tp=50;

 
Roman Epifanov #:

Especifico en la variable doble tp=50;

double takeProfit;
takeProfit = NormalizeDouble(Bid - tp * Point(), Digits()); // TP для Sell
 
Mihail Matkovskij #:

ahora escribe

2021.12.04 13:56:09.509 TestGenerator: error de datos no coincidentes (el valor alto 1.13110 en 2021.12.03 23:45 no se alcanza desde el marco temporal más bajo, el precio alto 1.13104 no coincide)


//+------------------------------------------------------------------+
//|                                                         repa.mq4 |
//|                        Copyright 2021, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2021, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property strict
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---
   
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---
   
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//---
   int i;
   double lot_sum;
   bool trend;
   double ema;
   double sl=50.0,tp=50.0;
   tp = NormalizeDouble(Bid - tp * Point(), Digits()); // TP для Sell
   double lot=0.01;
   while (i<OrdersTotal())
   {
   OrderSelect(i,SELECT_BY_POS,MODE_TRADES);
   lot_sum=lot_sum + OrderLots(); // сумма лотов открытых позиций
   
   
   }
   
   ema=iMA(NULL,0,50,0,MODE_EMA,PRICE_CLOSE,0); //взяли значение средней
   if (Close[0]<ema)trend=true ;else if(Close[0]>ema)trend=false; //определили тренд
   
   if (Close[1]<Open[1]) {OrderSend(Symbol(),OP_SELL,lot,Bid,2,Ask+sl,tp,"Candle sell, Close[0]<MA");};
   
   
  }
//+------------------------------------------------------------------+
 
Mihail Matkovskij #:

póngalo por un minuto... funciona...

pero el nivel de parada es diferente -

1 2021.09.16 05:59 vender 1 0.01 1.18190 51.18192 1.18140 0.00 10000.00


 
Roman Epifanov #:

ahora escribe

2021.12.04 13:56:09.509 TestGenerator: error de datos no coincidentes (el valor alto 1.13110 en 2021.12.03 23:45 no se alcanza desde el marco temporal más bajo, el precio alto 1.13104 no coincide)


void OnTick()
  {
//---
   int i;
   double lot_sum;
   bool trend;
   double ema;
   double sl=50.0,tp=50.0;
   double stopLoss, takeProfit, openPrice;
   double lot=0.01;
   while (i<OrdersTotal())
   {
     OrderSelect(i,SELECT_BY_POS,MODE_TRADES);
     lot_sum=lot_sum + OrderLots(); // сумма лотов открытых позиций
   
   }
   
   ema=iMA(NULL,0,50,0,MODE_EMA,PRICE_CLOSE,0); //взяли значение средней

   if (Close[0]<ema)
     trend=true ;
   else if(Close[0]>ema)
     trend=false; //определили тренд
    
   takeProfit = NormalizeDouble(Bid - tp * Point(), Digits()); // TP для Sell
   stopLoss = NormalizeDouble(Bid + sl * Point(), Digits()); // SL для Sell
   openPrice = NormalizeDouble(Bid, Digits());

   if (Close[1]<Open[1]) {
     OrderSend(Symbol(), OP_SELL, lot, openPrice, 2, stopLoss, takeProfit, "Candle sell, Close[0]<MA");
   }
   
  }

Todas las normas están en línea, así que compruébelo usted mismo.

 
Mihail Matkovskij #:

Todas las normas están en línea, así que compruébelo usted mismo.

Gracias.

 

Buenas noches señores, ¿podrían indicar por qué el asesor da un error al abrir un segundo pedido?


El texto del propio consejero



//+----------------------Параметры-----------------------------------+

input int TakeProfit = 100; // Beneficio en pips

input int StopLoss = 50; // Pérdida en pips

input double Lote = 0.01; // Lote inicial

input double Multilot = 1.95; // multiplicador para el lote inicial

input int Deslizamiento =30; // Deslizamiento

input int MagicNumber = 333 ; // Número único


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

//| Función de inicialización de expertos |

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

doble tp=0;

doble sl=0;

int OnInit()

{

tp=NormalizeDouble(TakeProfit*Punto(),Dígitos());

sl=NormalizeDouble(StopLoss*Point(),Digits());

return(INIT_SUCCEED);

}


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

//| Función de garrapata experta ||

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

void OnTick()

{

//--el bucle comprueba si hay órdenes abiertas cuando se activa el Asesor Experto y las calcula.

int buy=0; //Número de órdenes de COMPRA

int sell=0; //Número de órdenes de VENTA


for(int i = OrdersTotal()-1; i>=0; i--)

if(OrderSelect(i, SELECT_BY_POS,MODE_TRADES))

if(OrderSymbol()==Symbol())

if(OrderMagicNumber()== MagicNumber)

{

if(OrderType()==OP_BUY)

comprar++;

if(OrderType()==OP_SELL)

vender++;

}


//--el bucle recibe los datos de la última orden cerrada cuando se activa el EA

int type=-1; //el tipo de una orden cerrada

int history_close_orders=0; //número de pedidos cerrados

double lot=0; /Lote de la última orden cerrada

double profit=0; /Beneficio al que se cerró la última orden

datetime time=0; //Hora de cierre del último pedido


for(int i = OrdersHistoryTotal()-1; i>=0; i--)

if(OrderSelect(i, SELECT_BY_POS,MODE_HISTORY))

if(OrderSymbol()==Symbol())

if(OrderMagicNumber()== MagicNumber)

if(OrderCloseTime()>time)

{

history_close_orders++;

time = OrderCloseTime();//la última hora de cierre de la orden

lot= OrderLots();/Lote de la última orden cerrada

type=Tipo de orden();// Tipo de la última orden cerrada

profit=OrderProfit()*OrderSwap()*OrderCommission();/Beneficio de la última orden cerrada

}

//calcular el lote con el que trabajará el EA

double Lots_Work=0;// lote de trabajo


if(history_close_orders==0 || profit>0)// si no hay órdenes cerradas o la última orden cerró sobre el beneficio

Lots_Work=Lote;// el lote de trabajo es igual al lote inicial


if(history_close_orders>0 && profit<0) // si la última orden cerró en rojo

Lots_Work=1;// el lote de trabajo será igual al lote del último pedido multiplicado por el multiplicador


//abrir la primera orden de compra

if(buy==0 || profit>0)

{

int ticket=OrderSend(Symbol(),OP_BUY,Lots_Work,Ask,Slippage,0,0, "Expert Advisor Test fair",MagicNumber,0,clrGreen);

if(ticket<0)

Print("OrderSend failed with error #",GetLastError());

si no

Print("El envío del pedido se ha completado con éxito");

}


// Apertura de la segunda y siguientes órdenes de compra

if(buy==0 && type==OP_BUY && profit<0)

{

int ticket=OrderSend(Symbol(),OP_BUY,Lots_Work,Ask,Slippage,0,0, "EA Test fair",MagicNumber,0,clrGreen);

if(ticket<0)

Print("OrderSend failed with error #",GetLastError());

si no

Print("El envío del pedido se ha completado con éxito");

}


// Apertura de la primera orden de venta

if(vender==0 || beneficio>0)

{

int ticket=OrderSend(Symbol(),OP_SELL,Lots_Work,Bid,Slippage,0,0, "EA Test fair",MagicNumber,0,clrRed);

if(ticket<0)

Print("OrderSend failed with error #",GetLastError());

si no

Print("El envío del pedido se ha completado con éxito");

}

// Apertura de la segunda y siguientes órdenes de compra

if(sell==0 && (type==OP_SELL && profit<0))

{

int ticket=OrderSend(Symbol(),OP_SELL,Lots_Work,Bid,Slippage,0,0, "Expert Advisor Test fair",MagicNumber,0,clrRed);

if(ticket<0)

Print("OrderSend failed with error #",GetLastError());

si no

Print("El envío del pedido se ha completado con éxito");

}


//--Modificar la orden añadiendo Take Profit y Stop Loss

for(int i = OrdersTotal()-1; i>=0; i--)

if(OrderSelect(i, SELECT_BY_POS))

if(OrderSymbol()==Symbol())

if(OrderMagicNumber()== MagicNumber)

{

if(OrderType()==OP_BUY)

{

if(OrderStopLoss()==0 || OrderTakeProfit()==0)

if(OrderModify(OrderTicket(),OrderOpenPrice(),NormalizeDouble(OrderOpenPrice()-sl,Digits(),NormalizeDouble(OrderOpenPrice()+tp,Digits(),0,clrGreen))

Print("¡OrdenModificación OK!");

si no

Print("OrderModify BUY falló #", GetLastError());

}

if(OrderType()==OP_SELL)

{

if(OrderStopLoss()==0 || OrderTakeProfit()==0)

if(OrderModify(OrderTicket(),OrderOpenPrice(),NormalizeDouble(OrderOpenPrice()+sl,Digits(),NormalizeDouble(OrderOpenPrice()-tp,Digits(),0,clrRed))

Print("¡OrdenModificación OK!");

si no

Print("OrderModify SELL failed #", GetLastError());

}

}


}

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


 
Mi viejo portátil con procesador i3 aún tenía instalado WinXP 32 bits, sin soporte para MT5. Recientemente he aumentado la memoria a 6GB, quiero instalar un sistema operativo de 64 bits que ejecute MT4 y MT5. ¿Qué es preferible, Win7 o Win8.1?
 
atztek #:
Mi viejo portátil con procesador i3 aún tenía instalado WinXP 32 bits, sin soporte para MT5. Recientemente he aumentado la memoria a 6GB, quiero instalar un sistema operativo de 64 bits que ejecute MT4 y MT5. ¿Qué es preferible, Win7 o Win8.1?

10

 
Andrey Sokolov #:

10

Esta versión está instalada en un portátil nuevo, cansado de las constantes actualizaciones. Además, la gente escribe que el ocho funciona mejor que el diez en los portátiles antiguos. Dejaría WinXP en mi viejo portátil pero MT5 no funcionará en él, además 3Gb de memoria no es suficiente para XP. Aun así, si hay que elegir entre 7 y 8.1, ¿qué es mejor para realizar optimizaciones en MT4/5?