Donde cometí un error. ¿Por qué tengo una posición ampliada?
Existe un concepto llamado red. Según la filosofía del NETTING, todas las operaciones unidireccionales aumentan la posición, mientras que las multidireccionales la cierran, la disminuyen o la invierten.
Khomtchenko:
Comprobación por indicador - si debería haber una posición de Compra, pero hay una de Venta, entonces haga Compra.
Si sacamos una conclusión de la línea, entendemos que con una venta existente una nueva posición de compra cerrará o cortará la posición existente.
PS
Por cierto, el TP y el SL en MT5 se fijan en función de la última operación, por lo que deben ser controlados también...
¿Cuál es la forma correcta de eliminar todos los pedidos con un determinado modo?
Tengo dos funciones para esto, check_orders comprueba los pedidos con un determinado modo, y remove_sl los elimina:
El problema es que en el diario de mi EA me salen líneas como esta:
2011.05.11 21:40:19 Operaciones '726238' : falló la orden de cancelación #4375237 comprar 0.00 a 0.00000 [Solicitud inválida] Es decir, se envían peticiones innecesarias al servidor de comercio con una solicitud de eliminación de la orden ya solicitada.
Debería recorrer la lista de pedidos de arriba a abajo, por ejemplo
ЗЫ Если вы знаете инструмент то для поиска позиции совсем не нужно перебирать все позиции, достаточно воспользоваться вот этой функцией:
boolPositionSelect(
string symbol // имя инструмента
);
Gracias. Lo intentaré.
Por cierto, uso un símbolo.
Según la filosofía de este mismo NETTING, todas las operaciones unidireccionales aumentan la posición y las multidireccionales se cierran, disminuyen o invierten.
¡Exactamente!
Concluimos de la línea que entendemos que con una Venta existente una nueva Compra cerrará o recortará una posición existente.
PS
Por cierto, el TP y el SL en MT5 se fijan en función de la última operación, por lo que deben ser controlados también...
Por sus palabras, Sr.Interesante, entiendo que he comprendido todo correctamente.
Estoy utilizando los mismos lotes. Estoy utilizando los mismos topes. Todo es como debe ser. ¡Pero algo está mal!
De acuerdo. Prometió hacer dos EAs y mostrar la diferencia. Yo lo haré. No quiero poner la mejor para que la vea todo el mundo.
Entonces, ¿quién de los respetados expertos puede enviarme por correo electrónico dos EAs para la misma estrategia en mql4 y en mql5?
Sólo necesito averiguar qué estoy haciendo mal, eso es todo. Bueno, las diferentes estadísticas de precios no pueden cambiar los resultados de las pruebas por 2-3 veces. Se trata de programar.
Lizar,Renat,sergeev, Ayúdenme. Puedo darles a todos los expertos para que revisen el código. El Asesor Experto es sencillo pero eficaz. Todavía puedo mejorarlo, pero lo he simplificado al máximo, para que quede más clara la esencia del problema.
También pido disculpas a todos por haber sido destemplado en sus declaraciones. Estoy avergonzado. ¡Pero tengo MUCHAS ganas de entenderlo todo!
Hay que recorrer la lista de pedidos de arriba a abajo, por ejemplo, así:
No sirve de nada, aparentemente el pedido se borra con éxito y luego se envía otra solicitud:
2011.05.12 16:42:57 Operaciones '726238' : cancelar orden #4388299 comprar stop 0.02 EURUSD a 1.41700 hecho 2011.05.12 16:42:57 Operaciones '726238' : cancelar orden #4388299 comprar stop 0.02 EURUSD a 1.41700 2011.05.12 16:42:58 Operaciones '726238' : falló la cancelación de la orden #4388299 de compra de 0,00 a 0,00000 [Solicitud no válida] - ya se había realizado una compra mientras el stop de compra era
//+------------------------------------------------------------------+//| M2H1mql5.mq5 |//| Copyright 2011, Yuriy V.Khomtchenko |//| mr.Khomtchenko@gmail.com |//+------------------------------------------------------------------+#property copyright "Copyright 2011, Yuriy V.Khomtchenko"#property link "mr.Khomtchenko@gmail.com"#property version "1.00"MqlRates price[2];
double m_buff_EMAs[];
double m_buff_EMAb[];
double Ask;
double Bid;
int N=2;
double m_handle_ema1, m_handle_ema3;
externdouble Lots = 0.1;
externint Period_MA1=4;
externint Period_MA3=21;
bool mm =0;
bool New_Bar=false;
intconst magic=102406;
double Mas0, Mab0, Mas1, Mab1;
double
StopLoss=200,
TakeProfit=3200;
//+------------------------------------------------------------------+//| Expert initialization function |//+------------------------------------------------------------------+intOnInit()
{
//---
m_handle_ema1=iMA(_Symbol,_Period,Period_MA1,0,MODE_EMA,PRICE_CLOSE);
m_handle_ema3=iMA(_Symbol,_Period,Period_MA3,0,MODE_EMA,PRICE_CLOSE);
//---return(0);
}
//+------------------------------------------------------------------+//| Expert tick function |//+------------------------------------------------------------------+voidOnTick()
{
//---
GetIns();
if (!PositionSelect(_Symbol))
{
if(Mas0>Mab0 && Mas1<Mab1) OpenBuy(Lots,10,"EUR/USD (Buy)",102406);
if(Mas0<Mab0 && Mas1>Mab1) OpenSell(Lots,10,"EUR/USD (Sell)",102406);
}
if (PositionSelect(_Symbol)) TryToClose();
}
//+------------------------------------------------------------------+void GetIns()
{
CopyRates(_Symbol, _Period,0,2,price);
CopyBuffer(m_handle_ema1,0,0,N,m_buff_EMAs);
ArraySetAsSeries(m_buff_EMAs,true);
CopyBuffer(m_handle_ema3,0,0,N,m_buff_EMAb);
ArraySetAsSeries(m_buff_EMAb,true);
Mas0=m_buff_EMAs[0];
Mas1=m_buff_EMAs[1];
Mab0=m_buff_EMAb[0];
Mab1=m_buff_EMAb[1];
MqlTick last_tick;//Здесь будут храниться цены последнего пришедшего тикаSymbolInfoTick(_Symbol,last_tick);//заполняем структуру last_tick последними ценами текущего символа.
Ask=last_tick.ask;//Обновляем переменные Ask и Bid для дальнейшего использования
Bid=last_tick.bid;
return;
}
//Функция открытия длинной (Long) позиции. Указываем также значения переменных по умолчаниюint OpenBuy(double volume,int slippage=10,string comment="EUR/USD (Buy)",int magic0=102406)
{
MqlTradeRequest my_trade;//объявляем структуру типа MqlTradeRequest для формирования запросаMqlTradeResult my_trade_result;//в этой структуре будет ответ сервера на запрос.//далее заполняеем все НЕОБХОДИМЫЕ поля структуры запроса.
my_trade.action=TRADE_ACTION_DEAL;//Установить торговый ордер на немедленное совершение сделки с указанными //параметрами (поставить рыночный ордер)
my_trade.symbol=Symbol();//указываем в качестве валютной пары - текущую валютную пару //(ту, на которой запущен советник)
my_trade.volume=NormalizeDouble(volume,1);//размер лота
my_trade.price=NormalizeDouble(Ask,_Digits);//Цена, при достижении которой ордер должен быть исполнен. //В нашем случае для TRADE_ACTION_DEAL это текущая цена и ее, согласно инструкции указывать не обязательно.
my_trade.sl=NormalizeDouble(Ask-StopLoss*_Point,_Digits);//стоплосс ордера (цена при которой следует закрыть //убыточную сделку)
my_trade.tp=NormalizeDouble(Ask+TakeProfit*_Point,_Digits);//тейкпрофит (цена при которой следует закрыть// прибыльную сделку)
my_trade.deviation=slippage;//проскальзывание в пунктах (при тестировании особой роли не играет, т.к. //проскальзывания не бывает на тестах)
my_trade.type=ORDER_TYPE_BUY;//тип рыночного ордера (покупаем)
my_trade.type_filling=ORDER_FILLING_AON;//Указываем как исполнять ордер. (All Or Nothing - все или ничего) //Сделка может быть совершена исключительно в указанном объеме и по цене равной или лучше указанной в ордере.
my_trade.comment=comment;//комментарий ордера
my_trade.magic=magic;//магическое число ордераResetLastError();//обнуляем код последней ошибки if(OrderSend(my_trade,my_trade_result))//отправляем запрос на открытие позиции. При этом проверяем //успешно ли прошла отправка запроса
{
// Если сервер принял ордер то смортрим на результат Print("Код результата операции - ",my_trade_result.retcode);
}
else
{
//Сервер не принял ордер в нем есть ошибки, выводим их в журналPrint("Код результата операции - ",my_trade_result.retcode);
Print("Ошибка открытия ордера = ",GetLastError());
}
return(0);// Выходим из функции открытия ордера
}
//функция открытия короткой (Short) позиции. Аналогична функции открытия длинной позиции.int OpenSell(double volume,int slippage=10,string comment="Open Short EUR/USD (Sell)",int magic0=102406)
{
MqlTradeRequest my_trade;
MqlTradeResult my_trade_result;
my_trade.action=TRADE_ACTION_DEAL;
my_trade.symbol=Symbol();
my_trade.volume=NormalizeDouble(volume,1);
my_trade.price=NormalizeDouble(Bid,_Digits);
my_trade.sl=NormalizeDouble(Bid+StopLoss*_Point,_Digits);
my_trade.tp=NormalizeDouble(Bid-TakeProfit*_Point,_Digits);
my_trade.deviation=slippage;
my_trade.type=ORDER_TYPE_SELL;
my_trade.type_filling=ORDER_FILLING_AON;
my_trade.comment=comment;
my_trade.magic=magic;
ResetLastError();
if(OrderSend(my_trade,my_trade_result))
{
Print("Код результата операции - ",my_trade_result.retcode);
}
else
{
Print("Код результата операции - ",my_trade_result.retcode);
Print("Ошибка открытия ордера = ",GetLastError());
}
return(0);
}
int TryToClose()
{
if (PositionGetInteger(POSITION_TYPE)==POSITION_TYPE_BUY)
if(Mas0<Mab0 && Mas1>Mab1) OpenSell(Lots,10,"EUR/USD (Sell)",102406);
if (PositionGetInteger(POSITION_TYPE)==POSITION_TYPE_SELL)
if(Mas0>Mab0 && Mas1<Mab1) OpenBuy(Lots,10,"EUR/USD (Buy)",102406);
return(0);
}
No sirve de nada, aparentemente el pedido se borra con éxito y luego se envía otra solicitud:
2011.05.12 16:42:57 Operaciones '726238' : cancelar orden #4388299 comprar stop 0.02 EURUSD a 1.41700 hecho 2011.05.12 16:42:57 Operaciones '726238' : cancelar orden #4388299 comprar stop 0.02 EURUSD a 1.41700 2011.05.12 16:42:58 Operaciones '726238' : falló la cancelación de la orden #4388299 de compra de 0,00 a 0,00000 [Solicitud no válida] - ya se había realizado una compra mientras el stop de compra era
Me avergüenza admitir que aún no domino el arte de la telepatía.
El problema es que en el diario de EA aparecen estas líneas:
2011.05.11 21:40:19 Operaciones '726238' : falló la orden de cancelación #4375237 comprar 0.00 a 0.00000 [Solicitud inválida] Es decir, se envían solicitudes innecesarias al servidor de comercio para eliminar la orden que ya se había solicitado.
Ha aconsejado lo siguiente:
Hay que recorrer la lista de pedidos de arriba a abajo, por ejemplo, así:
He intentado hacer lo que me has dicho, pero el problema sigue siendo que primero se elimina la orden pendiente y luego se envía otra solicitud para eliminar la misma orden. Este es un ejemplo de las líneas de registro:
2011.05.12 16:42:57 Operaciones '726238' : cancelar orden #4388299 comprar stop 0.02 EURUSD a 1.41700 hecho - eliminado con éxito la orden 2011.05.12 16:42:57 Operaciones '726238' : cancelar orden #4388299 comprar stop 0.02 EURUSD a 1.41700 - Se está enviando otra solicitud 2011.05.12 16:42:58 Operaciones '726238' : falló la cancelación de la orden #4388299 de compra de 0,00 a 0,00000 [Solicitud no válida] - era de compra por alguna razón.
Esto no ocurre siempre, sino a veces, y no afecta al funcionamiento del Asesor Experto. Sólo quiero hacerlo todo correctamente, no cargar el servidor de comercio con peticiones vacías, y solucionar el problema.
Gracias por sus respuestas y por su disposición a ayudar.
Donde cometí un error. ¿Por qué tengo una posición ampliada?
Existe un concepto llamado red. Según la filosofía del NETTING, todas las operaciones unidireccionales aumentan la posición, mientras que las multidireccionales la cierran, la disminuyen o la invierten.
Si sacamos una conclusión de la línea, entendemos que con una venta existente una nueva posición de compra cerrará o cortará la posición existente.
PS
Por cierto, el TP y el SL en MT5 se fijan en función de la última operación, por lo que deben ser controlados también...
¿Cuál es la forma correcta de eliminar todos los pedidos con un determinado modo?
Tengo dos funciones para esto, check_orders comprueba los pedidos con un determinado modo, y remove_sl los elimina:
El problema es que en el diario de mi EA me salen líneas como esta:
2011.05.11 21:40:19 Operaciones '726238' : falló la orden de cancelación #4375237 comprar 0.00 a 0.00000 [Solicitud inválida]
Es decir, se envían peticiones innecesarias al servidor de comercio con una solicitud de eliminación de la orden ya solicitada.
Debería recorrer la lista de pedidos de arriba a abajo, por ejemplo
ЗЫ Если вы знаете инструмент то для поиска позиции совсем не нужно перебирать все позиции, достаточно воспользоваться вот этой функцией:
Gracias. Lo intentaré.
Por cierto, uso un símbolo.
Según la filosofía de este mismo NETTING, todas las operaciones unidireccionales aumentan la posición y las multidireccionales se cierran, disminuyen o invierten.
¡Exactamente!
Concluimos de la línea que entendemos que con una Venta existente una nueva Compra cerrará o recortará una posición existente.
PS
Por cierto, el TP y el SL en MT5 se fijan en función de la última operación, por lo que deben ser controlados también...
Por sus palabras, Sr.Interesante , entiendo que he comprendido todo correctamente.
Estoy utilizando los mismos lotes. Estoy utilizando los mismos topes. Todo es como debe ser. ¡Pero algo está mal!
De acuerdo. Prometió hacer dos EAs y mostrar la diferencia. Yo lo haré. No quiero poner la mejor para que la vea todo el mundo.
Entonces, ¿quién de los respetados expertos puede enviarme por correo electrónico dos EAs para la misma estrategia en mql4 y en mql5?
Sólo necesito averiguar qué estoy haciendo mal, eso es todo. Bueno, las diferentes estadísticas de precios no pueden cambiar los resultados de las pruebas por 2-3 veces. Se trata de programar.
Lizar,Renat,sergeev, Ayúdenme. Puedo darles a todos los expertos para que revisen el código. El Asesor Experto es sencillo pero eficaz. Todavía puedo mejorarlo, pero lo he simplificado al máximo, para que quede más clara la esencia del problema.
También pido disculpas a todos por haber sido destemplado en sus declaraciones. Estoy avergonzado. ¡Pero tengo MUCHAS ganas de entenderlo todo!
Hay que recorrer la lista de pedidos de arriba a abajo, por ejemplo, así:
No sirve de nada, aparentemente el pedido se borra con éxito y luego se envía otra solicitud:
2011.05.12 16:42:57 Operaciones '726238' : cancelar orden #4388299 comprar stop 0.02 EURUSD a 1.41700 hecho
2011.05.12 16:42:57 Operaciones '726238' : cancelar orden #4388299 comprar stop 0.02 EURUSD a 1.41700
2011.05.12 16:42:58 Operaciones '726238' : falló la cancelación de la orden #4388299 de compra de 0,00 a 0,00000 [Solicitud no válida] - ya se había realizado una compra mientras el stop de compra era
similar, pero en mql4:
Bueno, mira y compara. He metido la pata en alguna parte... La diferencia es sustancial.
No sirve de nada, aparentemente el pedido se borra con éxito y luego se envía otra solicitud:
2011.05.12 16:42:57 Operaciones '726238' : cancelar orden #4388299 comprar stop 0.02 EURUSD a 1.41700 hecho
2011.05.12 16:42:57 Operaciones '726238' : cancelar orden #4388299 comprar stop 0.02 EURUSD a 1.41700
2011.05.12 16:42:58 Operaciones '726238' : falló la cancelación de la orden #4388299 de compra de 0,00 a 0,00000 [Solicitud no válida] - ya se había realizado una compra mientras el stop de compra era
Me avergüenza admitir que aún no domino el arte de la telepatía.
Repetiré la pregunta:
¿Cómo puedo eliminar correctamente todos los pedidos con un determinado cargador?
Tengo dos funciones para esto, check_orders comprueba los pedidos con un determinado modo y remove_sl los elimina:
El problema es que en el diario de EA aparecen estas líneas:
2011.05.11 21:40:19 Operaciones '726238' : falló la orden de cancelación #4375237 comprar 0.00 a 0.00000 [Solicitud inválida]
Es decir, se envían solicitudes innecesarias al servidor de comercio para eliminar la orden que ya se había solicitado.
Ha aconsejado lo siguiente:
Hay que recorrer la lista de pedidos de arriba a abajo, por ejemplo, así:
He intentado hacer lo que me has dicho, pero el problema sigue siendo que primero se elimina la orden pendiente y luego se envía otra solicitud para eliminar la misma orden. Este es un ejemplo de las líneas de registro:
2011.05.12 16:42:57 Operaciones '726238' : cancelar orden #4388299 comprar stop 0.02 EURUSD a 1.41700 hecho - eliminado con éxito la orden
2011.05.12 16:42:57 Operaciones '726238' : cancelar orden #4388299 comprar stop 0.02 EURUSD a 1.41700 - Se está enviando otra solicitud
2011.05.12 16:42:58 Operaciones '726238' : falló la cancelación de la orden #4388299 de compra de 0,00 a 0,00000 [Solicitud no válida] - era de compra por alguna razón.
Esto no ocurre siempre, sino a veces, y no afecta al funcionamiento del Asesor Experto. Sólo quiero hacerlo todo correctamente, no cargar el servidor de comercio con peticiones vacías, y solucionar el problema.
Gracias por sus respuestas y por su disposición a ayudar.