//+------------------------------------------------------------------+//| 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);
}
我犯错误的地方。为什么我会得到一个扩大的位置。
有一个概念叫做净值化。根据NETTING的理念,所有的单向交易都是增加仓位,而多向交易则是平仓、减仓或逆转。
如果我们从这条线得出结论,我们就会明白,在现有的卖出的情况下,新的买入位置将关闭或削减现有的位置。
PS
顺便说一下,MT5中的TP和SL是根据最后一笔交易设置的,所以它们也应该被监控...
我怎样才能正确地删除所有具有某种模式的订单?
我有两个函数用于此,check_orders检查具有某种模式的订单,remove_sl删除它们。
问题是,在我的EA的日志中,我得到了这样的行文。
2011.05.11 21:40:19 交易 '726238' : 取消订单失败 #4375237 在0.00000买入0.00[无效请求]
即向交易服务器发送不必要的请求,要求删除已经被请求的订单。
我应该从上到下看一遍订单清单,比如说。
ЗЫ Если вы знаете инструмент то для поиска позиции совсем не нужно перебирать все позиции, достаточно воспользоваться вот этой функцией:
谢谢你。我会试一试的。
顺便说一下,我使用一个符号。
根据这种非常NETTING的理念,所有的单向交易都会增加仓位,而多向交易则会关闭、减少或逆转。
正是如此!
我们从这句话中得出结论,我们了解到在现有的卖出的情况下,新的买入将关闭或削减现有的头寸。
PS
顺便说一下,MT5中的TP和SL是根据最后一笔交易设置的,所以它们也应该被监控...
从你的话中,有趣的 先生,我 明白我的理解是正确的。
我正在使用相同的批次。我正在使用相同的止损点。一切都是理所当然的。但有些事情是不对的!
好的。答应做两个EA,并显示差异。我会做的。我不想把最好的那个放在外面让大家看。
那么,在受人尊敬的专家中,谁能为同一策略在mql4和mql5上的两个EA发送电子邮件?
我只是需要弄清楚我做错了什么,就这样。那么,不同的价格统计不可能改变2-3倍的测试结果。这是关于编程。
Lizar,Renat,sergeev, 帮助我。我可以给你所有的专家来审查代码。专家顾问简单而有效。我仍然可以改进它,但我已经最大限度地简化了它,使问题的本质更加清晰。
我也为自己在发言中的无礼行为向大家道歉。我很 难为情。但我非常想了解所有的事情!
需要从上到下浏览订单列表,例如,像这样。
没有帮助,显然订单被成功删除,然后又发出另一个请求。
2011.05.12 16:42:57 交易 '726238' : 取消订单#4388299 买入止损0.02 EURUSD at 1.41700 成交
2011.05.12 16:42:57 交易 '726238' : 取消订单 #4388299 买入止损0.02 EURUSD at 1.41700
2011.05.12 16:42:58 交易 '726238' : 取消订单#4388299买入0.00 at 0.00000失败 [无效请求] - 已经是买入,而买入停止是
类似,但在mql4上。
好吧,看看并比较一下。我在什么地方搞砸了...差异是巨大的。
没有帮助,显然订单被成功删除,然后又发出另一个请求。
2011.05.12 16:42:57 交易 '726238' : 取消订单#4388299 买入止损0.02 EURUSD at 1.41700 成交
2011.05.12 16:42:57 交易 '726238' : 取消订单 #4388299 买入止损0.02 EURUSD at 1.41700
2011.05.12 16:42:58 交易 '726238' : 取消订单#4388299买入0.00 at 0.00000失败 [无效请求] - 已经是买入,而买入停止是
我很惭愧地承认,我仍然没有掌握心灵感应的艺术。
我将重复这个问题。
我怎样才能正确地删除所有带有某个磁带的订单?
我有两个函数用于此,check_orders检查具有某种模式的订单,remove_sl删除它们。
问题是,在EA的日志中出现了这些线条。
2011.05.11 21:40:19 交易 '726238' : 取消订单失败 #4375237 在0.00000买入0.00[无效请求]
即向交易服务器发出不必要的请求,以删除已经被请求的订单。
你已建议如下。
你需要从上到下浏览订单列表,例如像这样。
我试着按你说的做了,但问题仍然存在--先是删除了待定订单,然后又发出另一个请求,删除同一订单。下面是一个日志行的例子。
2011.05.12 16:42:57 交易 '726238' : 取消订单 #4388299 买入止损 0.02 EURUSD at 1.41700 完成- 成功删除订单。
2011.05.12 16:42:57 交易 '726238' : 取消订单 #4388299 买入止损 0.02 EURUSD at 1.41700- 另一个请求正在发送中
2011.05.12 16:42:58 交易 '726238' : 取消订单#4388299买入0.00 at 0.00000失败 [无效请求]- 它是买入的,因为某些原因。
这种情况不是每次都发生,但有时会发生,而且不影响专家顾问的操作。我只想正确地做每一件事,不要用空的请求加载贸易服务器,并解决这个问题。
感谢你们的答复和你们愿意提供的帮助。