//+------------------------------------------------------------------+//| 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の哲学によれば、すべての一方向取引はポジションを増加させ、多方向取引はポジションを閉じる、減少させる、または逆転させます。
この線から結論を導き出すと、既存の売りのポジションで、新しい買いのポジションは、既存のポジションを閉じるか、カットすることになると理解できます。
追記
ちなみに、MT5のTPとSLは最後の取引に応じて設定されるので、こちらも監視する必要があります...。
特定のモードの注文を正しく削除するにはどうすればよいですか?
そのための関数として、check_ordersは特定のモードを持つ注文をチェックし、remove_slはそれらを削除する、という2つの関数を持っています。
問題は、EAの日記に、こんなセリフが出ることです。
2011.05.11 21:40:19 トレード '726238' : 注文のキャンセルに失敗 #4375237 0.00で買い 0.00000 [無効なリクエスト]である。
すなわち、不要なリクエストは、すでにリクエストされた注文の削除要求とともにトレードサーバーに送信されます。
注文のリストを上から下へ、たとえば
ЗЫ Если вы знаете инструмент то для поиска позиции совсем не нужно перебирать все позиции, достаточно воспользоваться вот этой функцией:
ありがとうございます。試してみます。
ちなみに、私は1つの記号を使っています。
まさにこのNETTINGの哲学によれば、すべての一方向取引はポジションを増加させ、多方向取引はクローズ、減少または逆転させるのです。
そのとおりです。
私たちは、既存の売りと新しい買いが、既存のポジションを閉じるか切り詰めると理解しているラインから結論付けています。
追記
ちなみに、MT5のTPとSLは最後の取引に応じて設定されるので、こちらも監視する必要があります...。
面白い さんの言葉から、私はすべてを正しく理解しているのだと理解しました。
同じロットを使っています。同じストッパーを使用しています。すべては思いのまま。しかし、何かがおかしい!
なるほど。2つのEAを行い、その違いを見せることを約束した。私がやります。最高の1枚をみんなに見せたいとは思わないんです。
そこで、尊敬する専門家の中で、mql4とmql5で同じ戦略の2つのEAをメールで送ることができるのは誰でしょうか?
何が間違っているのか、それを突き止めたいだけなんです。まあ、価格の統計が違えば、テスト結果が2〜3倍も変わるわけではありません。プログラミングについてです。
Lizar,Renat,sergeev, HELP me.コードをレビューするために、すべてのエキスパートを提供することができます。Expert Advisorは、シンプルでありながら効果的です。まだまだ改良は可能ですが、問題の本質を明確にするため、最大限簡略化しました。
また、皆さんには、発言に乱暴なところがあったことをお詫びします。照れますね。でも、すべてを理解したい!というのがVERYの願いです。
注文のリストを上から下へ、例えばこのように見ていく必要があります。
どうやら注文は正常に削除された後、再度リクエストが送信されるようです。
2011.05.12 16:42:57 トレード '726238' : 注文をキャンセル #4388299 買いストップ 0.02 EURUSD at 1.41700 done
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 done
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はそれらを削除する、という2つの関数を持っています。
問題は、EAのジャーナルで、このような行が表示されることです。
2011.05.11 21:40:19 トレード '726238' : 注文のキャンセルに失敗 #4375237 0.00で買い 0.00000 [無効なリクエスト]である。
すなわち、すでにリクエストされた注文を削除するために、不必要なリクエストが取引サーバーに送信されます。
というアドバイスをいただきました。
例えばこのように、注文のリストを上から下へと見ていく必要があります。
言われたようにやってみましたが、問題は残ったままです。保留中の注文が 最初に削除され、次に同じ注文を削除するために別のリクエストが送信されます。以下は、ログ行の一例です。
2011.05.12 16:42:57 トレード '726238' : キャンセルオーダー #4388299 buy stop 0.02 EURUSD at 1.41700 done- successfully deleted order.
2011.05.12 16:42:57 トレード '726238' : キャンセルオーダー #4388299 buy stop 0.02 EURUSD at 1.41700- Another request is being sent.
2011.05.12 16:42:58 Trades '726238' : failed cancel order #4388299 buy 0.00 at 0.00000 [Invalid request]- It was buy for some reason.
この現象は毎回起こるわけではなく、時々起こるもので、Expert Advisorの動作に影響はありません。私はただ、すべてを正しく行い、空のリクエストでトレードサーバーに負荷をかけないようにし、問題を整理したいだけなのです。
お返事をいただき、ありがとうございました。