SGarnov: Intenté insertarlo, pero no compila. Todo el código, si es necesario, pondré una captura de pantalla de la compilación. Creo que puede haber otro problema, mi TP está fijado en relación con el STOP por el coeficiente (variable externa), tal vez se puede cambiar a la configuración manual y será más fácil para EA para agregar?
del ámbito global, eliminar magic=0 para la compilación.
Eliminado, no hay errores de compilación, sólo aparece 1 advertencia en la tercera línea de la función en la columna tp=0 con la vista en la variable externa int tp=0. No entiendo muy bien qué es lo que no le gusta al programador. Todo el código adjunto, si no es difícil de corregir, la verdad está en algún lugar cerca.
Eliminado, no hay errores de compilación, sólo aparece 1 advertencia en la tercera línea de la función en la columna tp=0 con la vista en la variable externa int tp=0. No entiendo muy bien qué es lo que no le gusta al programador. Todo el código adjunto, si no es difícil de corregir, la verdad está en algún lugar cercano.
Se ve así
//+------------------------------------------------------------------+//| SGarnov.v2.mq4 |//| Copyright 2020, DrMak. |//| https://www.mql5.com |//+------------------------------------------------------------------+#property copyright"Copyright 2020, DrMak."#property link"https://www.mql5.com"#property version"1.00"#property strict//--- input parametersinputint T_Profit = 2; // Коэффициент Take Profitinputint S_Loss = 100; // Уровень Stop Lossinputdouble O_Lots = 0.01; //Лотыinputint Input4;
inputint Input5;
inputint Input6;
double sl_price,tp_price,t_profit,s_loss;
//+------------------------------------------------------------------+//| Expert initialization function |//+------------------------------------------------------------------+intOnInit()
{
//---//---return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+//| Expert deinitialization function |//+------------------------------------------------------------------+voidOnDeinit(constint reason)
{
//---
}
//+------------------------------------------------------------------+//| Expert tick function |//+------------------------------------------------------------------+voidOnTick()
{
//---
t_profit = S_Loss*T_Profit;
s_loss = MathMax(S_Loss, MarketInfo(Symbol(), MODE_STOPLEVEL));
// Проверяем наличие ордеров BUYif(CountOrders(_Symbol, 0)>0)
{
// Проверяем последний закрытый ордер SELL на наличие убытка в пунктахif(GetPointLastLoss(1)>0)
{
// Если убыток есть, то добавляем пункты убытка
sl_price = NormalizeDouble(Point() * s_loss, Digits);
tp_price = NormalizeDouble(GetPointLastLoss(1)+Point() * t_profit, Digits);
ModifyOrder(_Symbol, sl_price, tp_price);
}
else
{
// Если убытка нет
sl_price = NormalizeDouble(Point() * s_loss, Digits);
tp_price = NormalizeDouble(Point() * t_profit, Digits);
ModifyOrder(_Symbol, sl_price, tp_price);
}
}
// Проверяем наличие ордеров SELLif(CountOrders(_Symbol, 1)>0)
{
// Проверяем последний закрытый ордер BUY на наличие убытка в пунктахif(GetPointLastLoss(0)>0)
{
// Если убыток есть, то добавляем пункты убытка
sl_price = NormalizeDouble(Point() * s_loss, Digits);
tp_price = NormalizeDouble(GetPointLastLoss(0)+Point() * t_profit, Digits);
ModifyOrder(_Symbol, sl_price, tp_price);
}
else
{
// Если убытка нет
sl_price = NormalizeDouble(Point() * s_loss, Digits);
tp_price = NormalizeDouble(Point() * t_profit, Digits);
ModifyOrder(_Symbol, sl_price, tp_price);
}
}
}
//+--------------------------------------------------------------------------------------------------------------------+//| Подсчет ордеров по типу |//+--------------------------------------------------------------------------------------------------------------------+//| 0 - ордера типа BUY 1 - ордера типа SELL |//| 2 - ордера типа BUYLIMIT 3 - ордера типа SELLLIMIT |//| 4 - ордера типа BUYSTOP 5 - ордера типа SELLSTOP |//| 6 - ордера типа Balance -1 - Все типы ордеров |//+--------------------------------------------------------------------------------------------------------------------+int CountOrders(string symb="", int or_ty=-1)
{
int cnt=0;
if(symb=="0") symb=_Symbol;
for(int pos=OrdersTotal()-1;pos>=0;pos--)
{
if(OrderSelect(pos,SELECT_BY_POS)==true)
{
if(OrderSymbol()==symb || symb=="")
{
if(or_ty<0 || or_ty==OrderType()) cnt++;
}
}
}
return(cnt);
}
//+----------------------------------------------------------------------------+//| Модификация ордера |//+----------------------------------------------------------------------------+//| sl - ценовой уровень стопа |//| tp - ценовой уровень тейка |//+----------------------------------------------------------------------------+void ModifyOrder(string symb="", double sl=0, double tp=0)
{
if(symb=="0") symb=_Symbol;
for(int pos=OrdersTotal()-1;pos>=0;pos--)
{
if(OrderSelect(pos,SELECT_BY_POS)==true)
{
if(OrderSymbol()==symb || symb=="")
{
if(OrderStopLoss()==0)
{
if(OrderType()==OP_BUY)
{
if(OrderModify(OrderTicket(), OrderOpenPrice(), OrderOpenPrice()-sl_price, OrderOpenPrice()+tp_price, OrderExpiration()))
{Print("Ордер модифицирован");}
else
{Print("Ошибка модификации ордера:", GetLastError());}
}
if(OrderType()==OP_SELL)
{
if(OrderModify(OrderTicket(), OrderOpenPrice(), OrderOpenPrice()+sl_price, OrderOpenPrice()-tp_price, OrderExpiration()))
{Print("Ордер модифицирован");}
else
{Print("Ошибка модификации ордера:", GetLastError());}
}
}
}
}
}
}
//+----------------------------------------------------------------------------+//| Возвращает пункты убытка последнего закрытого ордера в пунктах |//| 0 - последний ордер BUY |//| 1 - последний ордер SELL |//+----------------------------------------------------------------------------+double GetPointLastLoss( int or_ty=-1)
{
datetime t=0;
double result=0,p=0;
int i=OrdersHistoryTotal();
for(int pos=0; pos<i; pos++)
{
if(OrderSelect(pos, SELECT_BY_POS, MODE_HISTORY))
{
if((OrderSymbol()==_Symbol))
{
if(OrderType()==OP_BUY || OrderType()==OP_SELL)
{
if(t<OrderCloseTime())
{t=OrderCloseTime(); p=OrderProfit(); or_ty=OrderType();
if(or_ty==OP_BUY&&p<0)
{
result=OrderOpenPrice()-OrderClosePrice();
} else {result=0;}
if(or_ty==OP_SELL&&p<0)
{
result=OrderClosePrice()-OrderOpenPrice();
} else {result=0;}
}
}
}
}
}
return(result);
}
//+------------------------------------------------------------------+
Si describes lo que debe hacer el EA, intentaré ayudarte.
Coloco una orden pendiente de compra - el EA está trabajando - la orden pendiente se dispara - el EA "ve" esto y coloca un stop loss en esta orden abierta:
stop loss (el parámetro externo se establece en los ajustes);
Toma de beneficios(el parámetro externo se establece en los ajustes utilizando la proporción de, por ejemplo, 1 a 2);
A) Si el precio llega a Takei - el Asesor Experto elimina el Stop Loss y una orden de venta pendiente;
Variante 2.
B) Si el stop loss se activa y el EA "pasó a la historia", entonces:
Se abre una orden de venta y el Asesor Experto reposiciona esta orden:
stop loss (el parámetro externo se establece en los ajustes);
Take Profit + un Stop Loss activado del historial;
una orden de compra pendiente en el nivel de stop loss.
El precio alcanza la toma - el Asesor Experto elimina el stop loss y la orden de compra pendiente.
Y viceversa, si el trabajo comienza con una orden de venta pendiente.
Y así el asesor trabaja hasta que detiene su trabajo con el parámetro externo número de Stop Loss (en mi caso es 2, significa que la variante 2 se repetirá 3 veces y el asesor dejará de trabajar en el futuro y eliminará todas las órdenes pendientes, el primer stop no se tiene en cuenta).
Si no se alcanza el takei y se repite la variante 2, entonces se añaden 2 stops al takei y así sucesivamente, depende del parámetro externo establecido"Recuento de Stop Loss".
El código, que puse funciona como debería, excepto el problema, que he descrito (no ve en la historia de 1 parada o 2 paradas, que debe añadir a la toma).
Pongo una orden de compra pendiente - el EA está trabajando - la orden pendiente se dispara - el EA "ve" esto y coloca un stop loss en esta orden abierta:
stop loss (el parámetro externo se establece en los ajustes);
Toma de beneficios(el parámetro externo se establece en los ajustes utilizando la proporción de, por ejemplo, 1 a 2);
A) Si el precio llega a Takei - el Asesor Experto elimina el Stop Loss y una orden de venta pendiente;
Variante 2.
B) Si el stop loss se activa y el EA "pasó a la historia", entonces:
Se abre una orden de venta y el Asesor Experto reposiciona esta orden:
stop loss (el parámetro externo se establece en los ajustes)
Take Profit + un Stop Loss activado del historial;
una orden de compra pendiente en el nivel de stop loss.
El precio alcanza la toma - el Asesor Experto elimina el stop loss y la orden de compra pendiente.
Y viceversa, si el trabajo comienza con una orden de venta pendiente.
Y así el asesor trabaja hasta que detiene su trabajo con el parámetro externo número de Stop Loss (en mi caso es 2, significa que la variante 2 se repetirá 3 veces y el asesor dejará de trabajar en el futuro y eliminará todas las órdenes pendientes, el primer stop no se tiene en cuenta).
Si no se alcanza el takei y se repite la variante 2, entonces se añaden 2 stops al takei y así sucesivamente, depende del parámetro externo establecido"Recuento de Stop Loss".
El código, que puse funciona como debería, excepto el problema, que he descrito (no ve en la historia de 1 parada o 2 paradas, que debe añadir a la toma).
Es así.
"Número de Stop Loss": ¿en una fila o para el día actual?
"Número de Stop Loss": ¿en una fila o para el día actual?
El número de paradas seguidas en un par de divisas.
Para analizar el historial, el Asesor Experto inicialmente etiqueta las órdenes con sus IDs, pero no las encuentra en el historial, pensé que OrderMagikNumber() las buscaría. ¿Tal vez por el hecho de que en el historial se detiene de diferentes pares de divisas el EA deja de "verlos"?
¿volver a poner la fuente? Todo lo que tiene que hacer es corregir "buscar las operaciones de parada del historial y hacer que se añada a la toma recién colocada".
¿Tiene un EA que admita órdenes colocadas manualmente?
Intenté insertarlo, pero no compila. Todo el código, si es necesario, pondré una captura de pantalla de la compilación. Creo que puede haber otro problema, mi TP está fijado en relación con el STOP por el coeficiente (variable externa), tal vez se puede cambiar a la configuración manual y será más fácil para EA para agregar?
La función
del ámbito global. magic=0 para la compilación.
magic=0La función
del ámbito global, eliminar magic=0 para la compilación.
Eliminado, no hay errores de compilación, sólo aparece 1 advertencia en la tercera línea de la función en la columna tp=0 con la vista en la variable externa int tp=0. No entiendo muy bien qué es lo que no le gusta al programador. Todo el código adjunto, si no es difícil de corregir, la verdad está en algún lugar cerca.
Eliminado, no hay errores de compilación, sólo aparece 1 advertencia en la tercera línea de la función en la columna tp=0 con la vista en la variable externa int tp=0. No entiendo muy bien qué es lo que no le gusta al programador. Todo el código adjunto, si no es difícil de corregir, la verdad está en algún lugar cercano.
Se ve así
En tu caso no necesitas magia en absoluto
Así es.
En su caso la magia no es necesaria en absoluto.Gracias, lo probaré, informaré al respecto. Espero que funcione igual que el mío, pero añade un tope (si se activa) a la nueva toma.
¿Para qué se necesitan los parámetros externos Input4; 5; 6?
Gracias, lo probaré e informaré. Espero que funcione igual que el mío, pero añade una parada (si se dispara) a una nueva toma.
Aquí sólo hay modificaciones. No hay eliminación ni anulación de pedidos.
Si describes lo que debe hacer el EA, intentaré ayudarte.
¿Para qué se necesitan los parámetros externos Input4; 5; 6?
Si describes lo que debe hacer el EA, intentaré ayudarte.
Coloco una orden pendiente de compra - el EA está trabajando - la orden pendiente se dispara - el EA "ve" esto y coloca un stop loss en esta orden abierta:
stop loss (el parámetro externo se establece en los ajustes);
Toma de beneficios(el parámetro externo se establece en los ajustes utilizando la proporción de, por ejemplo, 1 a 2);
orden de venta pendiente en el nivel de stop loss.
Posibles escenarios.
Variante 1.
A) Si el precio llega a Takei - el Asesor Experto elimina el Stop Loss y una orden de venta pendiente;
Variante 2.
B) Si el stop loss se activa y el EA "pasó a la historia", entonces:
Se abre una orden de venta y el Asesor Experto reposiciona esta orden:
stop loss (el parámetro externo se establece en los ajustes);
Take Profit + un Stop Loss activado del historial;
una orden de compra pendiente en el nivel de stop loss.
El precio alcanza la toma - el Asesor Experto elimina el stop loss y la orden de compra pendiente.
Y viceversa, si el trabajo comienza con una orden de venta pendiente.
Y así el asesor trabaja hasta que detiene su trabajo con el parámetro externo número de Stop Loss (en mi caso es 2, significa que la variante 2 se repetirá 3 veces y el asesor dejará de trabajar en el futuro y eliminará todas las órdenes pendientes, el primer stop no se tiene en cuenta).
Si no se alcanza el takei y se repite la variante 2, entonces se añaden 2 stops al takei y así sucesivamente, depende del parámetro externo establecido"Recuento de Stop Loss".
El código, que puse funciona como debería, excepto el problema, que he descrito (no ve en la historia de 1 parada o 2 paradas, que debe añadir a la toma).
Así.
Pongo una orden de compra pendiente - el EA está trabajando - la orden pendiente se dispara - el EA "ve" esto y coloca un stop loss en esta orden abierta:
stop loss (el parámetro externo se establece en los ajustes);
Toma de beneficios(el parámetro externo se establece en los ajustes utilizando la proporción de, por ejemplo, 1 a 2);
orden de venta pendiente en el nivel de stop loss.
Posibles escenarios.
Variante 1.
A) Si el precio llega a Takei - el Asesor Experto elimina el Stop Loss y una orden de venta pendiente;
Variante 2.
B) Si el stop loss se activa y el EA "pasó a la historia", entonces:
Se abre una orden de venta y el Asesor Experto reposiciona esta orden:
stop loss (el parámetro externo se establece en los ajustes)
Take Profit + un Stop Loss activado del historial;
una orden de compra pendiente en el nivel de stop loss.
El precio alcanza la toma - el Asesor Experto elimina el stop loss y la orden de compra pendiente.
Y viceversa, si el trabajo comienza con una orden de venta pendiente.
Y así el asesor trabaja hasta que detiene su trabajo con el parámetro externo número de Stop Loss (en mi caso es 2, significa que la variante 2 se repetirá 3 veces y el asesor dejará de trabajar en el futuro y eliminará todas las órdenes pendientes, el primer stop no se tiene en cuenta).
Si no se alcanza el takei y se repite la variante 2, entonces se añaden 2 stops al takei y así sucesivamente, depende del parámetro externo establecido"Recuento de Stop Loss".
El código, que puse funciona como debería, excepto el problema, que he descrito (no ve en la historia de 1 parada o 2 paradas, que debe añadir a la toma).
Es así.
"Número de Stop Loss": ¿en una fila o para el día actual?
"Número de Stop Loss": ¿en una fila o para el día actual?
El número de paradas seguidas en un par de divisas.
Para analizar el historial, el Asesor Experto inicialmente etiqueta las órdenes con sus IDs, pero no las encuentra en el historial, pensé que OrderMagikNumber() las buscaría. ¿Tal vez por el hecho de que en el historial se detiene de diferentes pares de divisas el EA deja de "verlos"?
¿volver a poner la fuente? Todo lo que tiene que hacer es corregir "buscar las operaciones de parada del historial y hacer que se añada a la toma recién colocada".