どんな新人の質問でも、フォーラムを乱雑にしないように。プロフェッショナルは、通り過ぎないでください。Nowhere without you - 6. - ページ 1096 1...108910901091109210931094109510961097109810991100110111021103...1178 新しいコメント Alexey Viktorov 2016.09.14 08:12 #10951 abeiks:こんにちは。 TPでポジションがクローズされたかどうかは、どのように判断するのですか?OrderClosePrice()==OrderTakeProfit()の使い方が 正しいとは思えません。オーダーコメントで[tp]がある場合は、それを探してください。 Nauris Zukas 2016.09.14 08:46 #10952 AlexeyVik:注文の解説で、もしあれば[tp]を探してください...。 ありがとうございます。 削除済み 2016.09.14 12:12 #10953 こんにちは、プロフィです。help fix the error in the indicator......インジケーターのエラーを修正してください。インジケーターが動作しています。シグナルはバー0にトリガーされます。しかし、現在のバーで他のティックが受信されると、再びトリガーされ、新しいシグナルが表示されます。売りまたは買い-イベントが発生し、このオープンバーで他のイベントが処理されなかった場合、現在のイベント価格の場所にこのシグナルを丸で囲む必要があります。このバーで新しいシグナルや円を出さないようにしたい。________________________ナンセンスだ、偽信号だなどと言われるのは承知していますが、これこそ私が必要としているものなのです。旗や目印を作ればいいのは分かっているのですが......自分で言葉を勉強する時間がないんです。_________________________添付ファイルにそのようなフラグを追加し、追加した線に 色で印を付けて頂けるとありがたいのですが・・・・。ありがとうございます、そして誰かが反応してくれることを願っています ファイル: messages1409.mq4 5 kb Aleksandr Afanasenko 2016.09.14 13:03 #10954 alvlaf:何度かエラーを出し、修正できない。どうしたんですか?//+------------------------------------------------------------------+//| BB1.mq4//| Copyright 2016, MetaQuotes Software Corp.//| https://www.mql5.com |//+------------------------------------------------------------------+#property copyright "Copyright 2016, MetaQuotes Software Corp.#プロパティリンク "https://www.mql5.com"#property version "1.00"#プロパティの厳密さextern double Lots = 1; // ロット数extern int Exp = 1; // 有効期限extern int Wait = 2; // 一方向のローソク足の本数extern int Timeout = 1; // タイムスロットextern double Multiplier = 3; // 乗算器extern int Slippage = 5; // スリッページextern int Magic = 774274; // マジックextern int MaxOpenOrders = 1; // 最大注文数int ticket, Type, SymbolCount;ダブルプライス、ロットinput string TradeSymbols = "EURUSD_OP, GBPUSD_OP, AUDUSD_OP, NZDUSD_OP, USDCAD_OP, USDCHF_OP, GBPCAD_OP, AUDNZD_OP, CHFJPY_OP, GBPCHF_OP"; // 取引用のシンボルを表示します。string Symbols[50]; // 50は最大シンボル数です。//--------------------------------------------------int OnInit(){if (IsTesting() || !ExtractSymbols()){SymbolCount = 1;Symbols[0] = Symbol()。}return(INIT_SUCCEEDED);}//--------------------------------------------------bool ExtractSymbols(){ushort Comma = StringGetCharacter(",", 0);SymbolCount = StringSplit(TradeSymbols, Comma, Symbols)。for (int i = 0; i < SymbolCount; i++){StringToUpper(Symbols[i])。Symbols[i] = StringTrimRight(Symbols[i]); // 誤ってスペースが入らないようにする。Symbols[i] = StringTrimLeft(Symbols[i])とする。}if (SymbolCount > 0) return(true);return(false)です。}//--------------------------------------------------void OnTick(){for (int i=0; i<SymbolCount; i++){if (CountTrades() == 0) // 注文数は0でなければなりません。{if (((TypeLastHistOrder() == OP_BUY && PriceCloseLastHistOrder(OP_BUY) < PriceOpenLastHistOrder(OP_BUY)) |||)(TypeLastHistOrder() == OP_SELL && PriceCloseLastHistOrder(OP_SELL) > PriceOpenLastHistOrder(OP_SELL))&& MaxOpenOrders > OrdersTotal())// 最後の取引が負けている場合、同じ取引が開始されますが、ロットはより大きくなります。{Type = TypeLastHistOrder();if (Type == OP_BUY) Price = LastAsk;if (Type == OP_SELL) Price = LastBid;Lot = NormalizeDouble(LotsLastHistOrder()*Multiplier, 2)です。ticket = OrderSend(Symbols[i], Type, Lot, Price, Slippage, 0, 0, IntegerToString(Exp), Magic);}if (PriceCloseLastHistOrder() == PriceOpenLastHistOrder() && CountHistTrades() > 0 && MaxOpenOrders > OrdersTotal())// 最後の取引の利益がゼロに等しい場合、同じ取引が開始されます。{Type = TypeLastHistOrder();if (Type == OP_BUY) Price = LastAsk;if (Type == OP_SELL) Price = LastBid;Lot = NormalizeDouble(LotsLastHistOrder(), 2)。ticket = OrderSend(Symbols[i], Type, Lot, Price, Slippage, 0, 0, IntegerToString(Exp), Magic)}if (((TypeLastHistOrder() == OP_BUY && PriceCloseLastHistOrder(OP_BUY) > PriceOpenLastHistOrder(OP_BUY))|| (TypeLastHistOrder() == OP_SELL && PriceCloseLastHistOrder(OP_SELL) < PriceOpenLastHistOrder(OP_SELL))|| CountHistTrades() == 0)// 最後の取引で利益が出た場合、注文が開かれます。{if (SignalBuy(Symbols[i]) && MaxOpenOrders > OrdersTotal()){ticket = OrderSend(Symbols[i], OP_BUY, Lots, Ask, Slippage, 0, 0, IntegerToString(Exp), Magic)}if (SignalSell(Symbols[i]) && MaxOpenOrders > OrdersTotal()){ticket = OrderSend(Symbols[i], OP_SELL, Lots, Bid, Slippage, 0, 0, IntegerToString(Exp), Magic)}}}}//+------------------------------------------------------------------+int CountTrades(int type = -1){int cnt = 0;for (int i=OrdersTotal()-1; i>=0; i--){if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)){if (OrderMagicNumber() == Magic && (OrderType() == type || type == -1))cnt++です。}}return(cnt);}//+------------------------------------------------------------------+int CountHistTrades(int type = -1){int cnt = 0;for (int i=OrdersHistoryTotal()-1; i>=0; i--){if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY)){if (OrderMagicNumber() == Magic && (OrderType() == type || type == -1))cnt++です。}}return(cnt);}//+------------------------------------------------------------------+bool SignalBuy(文字列Sym){for (int i=1; i<=Wait; i++){double C = iClose(Sym, PERIOD_M5, i); // ここで必要なタイムフレームを指定する。double O = iOpen(Sym, PERIOD_M5, i);if (C > O) return(false);}if ((iBarShift(Sym, 0, TimeLastHistOrder()+Timeout) >= Wait || (Wait == 0 && TimeCurrent() >= TimeLastHistOrder()+Timeout)))&& CountHistTrades() > 0) return(true);if (CountHistTrades() == 0) return(true);return(false)です。}//+------------------------------------------------------------------+bool SignalSell(文字列Sym){for (int i=1; i<=Wait; i++){double C = iClose(Sym, PERIOD_M5, i); // ここで必要なタイムフレームを指定する。double O = iOpen(Sym, PERIOD_M5, i);if (C < O) return(false);}if ((iBarShift(Sym, 0, TimeLastHistOrder()+Timeout) >= Wait || (Wait == 0 && TimeCurrent() >= TimeLastHistOrder()+Timeout)))&& CountHistTrades() > 0) return(true);if (CountHistTrades() == 0) return(true);return(false)です。}//+------------------------------------------------------------------+datetime TimeLastHistOrder(int type = -1){datetime lasttime = 0;datetime opentime = 0;for (int i=OrdersHistoryTotal()-1; i>=0; i--){if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY)){if (OrderMagicNumber() == Magic && (OrderType() == type || type == -1)){if (OrderCloseTime() > lasttime){lasttime = OrderCloseTime();opentime = OrderOpenTime();}}}}return(opentime);}//+------------------------------------------------------------------+int TypeLastHistOrder(){datetime time = 0;int type = -1;for (int i=OrdersHistoryTotal()-1; i>=0; i--){if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY)){if (OrderMagicNumber() == Magic){if (OrderCloseTime() > time){time = OrderCloseTime();type = OrderType();}}}}return(type)です。}//+------------------------------------------------------------------+double LotsLastHistOrder(int type = -1){datetime time = 0;ダブルロット = 0;for (int i=OrdersHistoryTotal()-1; i>=0; i--){if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY)){if (OrderMagicNumber() == Magic && (OrderType() == type || type == -1)){if (OrderOpenTime() > time){time = OrderOpenTime();time = OrderLots();}}}}return(lots)です。}//+------------------------------------------------------------------+double PriceCloseLastHistOrder(int type = -1){datetime time = 0;二重価格 = 0;for (int i=OrdersHistoryTotal()-1; i>=0; i--){if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY)){if (OrderMagicNumber() == Magic && (OrderType() == type || type == -1)){if (OrderCloseTime() > time){time = OrderCloseTime();price = OrderClosePrice()。}}}}return(price)です。}//+------------------------------------------------------------------+double PriceOpenLastHistOrder(int type = -1){datetime time = 0;二重価格 = 0;for (int i=OrdersHistoryTotal()-1; i>=0; i--){if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY)){if (OrderMagicNumber() == Magic && (OrderType() == type || type == -1)){if (OrderCloseTime() > time){time = OrderCloseTime();price = OrderOpenPrice();}}}}return(price)です。} アレキサンダー、さらに悪いことに、2つの異なるシンボルをオープンすることに加え、1つの同じシンボルに対して同時に複数のポジションをオープンすることに成功しました。どこかあなたと私は、少し行き過ぎたところがある。 削除済み 2016.09.14 18:38 #10955 ニュースを見て取引できるよう、よろしくお願いします。主に2つの機能を持つEAを必要としています。 最初の機能:指定されたTPとSLで、指定された時間に、指定されたレベルの価格で、保留中の注文を 出すことです。 2つ目の機能は、保留中の注文を価格と平行に保つことです。価格と一緒に移動させるということです(手動でやるのは面倒くさいので)。ある時間、ニュースが発表された瞬間に、このアクションを止め、価格がいずれかのオーダーに触れるまで待つ必要があるのです。その後、2回目の注文はすぐに削除されます。 もう一度言います。 ニュース発表の2分前に、価格から10ポイント離れた場所に2つの逆指値注文を入れ、すぐに価格と平行に移動する機能を作動させ、2分後に価格と一緒に移動し、一方の注文は価格から逃げ、もう一方は価格に追いつく。ニュースリリースでは、注文移動待ちの機能を無効にしてから、いずれかの注文の内訳を待つ必要があります。2つ目の注文は、1つ目の注文が壊れた直後に削除されます。 EAのプロパティで変更される変数(だいたい想像で、現実の実感は分かりませんが) TP - 600 (デフォルト)トロール - 300(デフォルト)SL - 100(デフォルト)Pips - 100 (デフォルトでは価格からの距離)スリッページ - 100 (デフォルトではpips単位のスリッページ)ロット - 0.1リスク - 10 // パーセント(まあ、これは必要ないので、必要なら後で聞きますが。)TimeNews1On - true (下のセルを使って時間を入力、false - advisorはそれらを取引しない)TimeNewsHour - 時間 (ニュースリリース時間 1)TimeNewsMin - 分 (ニュースリリース時間1)TimeNews2On - false (デフォルト)TimeNewsHour - 時間 (ニュースリリース時間 2)TimeNewsMin - 分 (ニュースリリース時間2)TimeNews3On - falseTimeNewsHour - 時間 (ニュースリリース時間 3)TimeNewsMin - 分 (ニュースリリース時間3)TimeNews4On - falseTimeNewsHour - 時間 (ニュースリリース時間 4)TimeNewsMin - 分 (ニュースリリース時間4)TimeNews5On - falseTimeNewsHour - 時間 (ニュースリリース時間 5)TimeNewsMin - 分 (ニュースリリース時間5) インスタ、5桁。私はこれをすべて手作業でやっているのですが、面倒くさいし、今はニュースを解決する時間がないので、その日にニュースがあるペアに朝か夜にExpert Advisorを置きたいので、すべて解決します。-------------------------------------- そのような専門家をご存知の方は、ぜひ教えてください。 ありがとうございました。 アドバイザーを無料でお書きします A13ksandr 2016.09.15 02:22 #10956 alvlaf:ソースコードに戻りましょう。こんな風に試してみてください。int OnInit(){if (!GlobalVariableCheck("AllowNewOrders")) GlobalVariableSet("AllowNewOrders",1).AllowNewOrders を設定します。 return(INIT_SUCCEED);}void OnDeInit(){GlobalVariableSet("AllowNewOrders",1)。}void OnTick(){if (CountTrades() == 0) // 注文数はゼロでなければなりません。{if ((TypeLastHistOrder() == OP_BUY && PriceCloseLastHistOrder(OP_BUY) < PriceOpenLastHistOrder(OP_BUY))|| (TypeLastHistOrder() == OP_SELL && PriceCloseLastHistOrder(OP_SELL) > PriceOpenLastHistOrder(OP_SELL))// 最後の取引が負けた場合、同じ取引が開始されますが、ロットは大きくなります。{GlobalVariableSet("AllowNewOrders", 0);Type = TypeLastHistOrder();if (Type == OP_BUY) Price = Ask;if (Type == OP_SELL) Price = Bid;Lot = NormalizeDouble(LotsLastHistOrder()*Multiplier, 2)です。ticket = OrderSend(Symbol(), Type, Lot, Price, Slippage, 0, 0, IntegerToString(Exp), Magic);}if (PriceCloseLastHistOrder() == PriceOpenLastHistOrder() && CountHistTrades() > 0)//最後の取引の利益が ゼロに等しい場合、同じ取引が開始されます。{GlobalVariableSet("AllowNewOrders", 0);Type = TypeLastHistOrder();if (Type == OP_BUY) Price = Ask;if (Type == OP_SELL) Price = Bid;Lot = NormalizeDouble(LotsLastHistOrder(), 2);ticket = OrderSend(Symbol(), Type, Lot, Price, Slippage, 0, 0, IntegerToString(Exp), Magic);}if (((TypeLastHistOrder() == OP_BUY && PriceCloseLastHistOrder(OP_BUY) > PriceOpenLastHistOrder(OP_BUY))|| (TypeLastHistOrder() == OP_SELL && PriceCloseLastHistOrder(OP_SELL) < PriceOpenLastHistOrder(OP_SELL))|| CountHistTrades() == 0)// 最後の取引で利益が出た場合、注文が開かれます。{if (GlobalVariableGet("AllowNewOrders") > 0)return;if (SignalBuy() && MaxOpenOrders > OrdersTotal()){ticket = OrderSend(Symbol(), OP_BUY, Lots, Ask, Slippage, 0, 0, IntegerToString(Exp), Magic)です。if (ticket>0) GlobalVariableSet("AllowNewOrders", 0);}if (SignalSell() && MaxOpenOrders > OrdersTotal()){ticket = OrderSend(Symbol(), OP_SELL, Lots, Bid, Slippage, 0, 0, IntegerToString(Exp), Magic)です。if (ticket>0) GlobalVariableSet("AllowNewOrders", 0);}}}}注文の総指値が1つのEAを複数枚使うと、どのシンボルで(利益が出た後に)取引を開始するのが良いのかが分からないので、確認していません。 Any rookie question, so エラー、バグ、質問 MQL4、MQL5に関する初心者からの質問、アルゴリズムやコードに関するヘルプ、ディスカッションなど。 A13ksandr 2016.09.15 02:49 #10957 BooGUY:ニュースでの取引にお役立てください。主に2つの機能を持つEAが必要です。 最初の機能:指定されたTPとSLで、指定された時間に、価格から指定されたレベルで、保留中の注文を 出すことです。 2つ目の機能は、保留中の注文を価格と平行に保つことです。価格と一緒に移動させるということです(手動でやるのは面倒なので)。ある時間、ニュースが発表された瞬間に、このアクションを止め、価格がいずれかのオーダーに触れるまで待つ必要があるのです。その後、2回目の注文はすぐに削除されます。 もう一度言います。 ニュース発表の2分前に、価格から10ポイント離れた場所に2つの逆指値注文を入れ、すぐに価格と平行に移動する機能を作動させ、2分後に価格と一緒に移動し、一方の注文は価格から逃げ、もう一方は価格に追いつきます。ニュースリリースでは、注文移動待ちの機能を無効にしてから、いずれかの注文の内訳を待つ必要があります。2枚目は1枚目の故障後、すぐに削除されます。そのようなアドバイザーをご存知の方、またはお会いしたことのある方は、ぜひ教えてください。 ありがとうございました。ファイルからニュースを読み取るコードを送りますので、便利かもしれませんね。週に一度、経済カレンダーを見て、あなたが注意を払うべきニュースのファイルfolder_with_terminalMQL4㏄Filesnovosti.txtにデータを入力して、アドバイザーは、ニュースの直前でも有効にすることができます(あなたが強い動きがある場合に、例えば、アメリカのセッション - の始まりを追跡するのにこの顧問を使うことができます)。ニュースで何度か本気で「だまされた」ので、トレーディングコードは完成してません :))最新バージョンでは、6つの注文(買いストップ3つ+売りストップ3つ)を異なる距離で、異なるTake Profitで発注しました。とにかく、私のニュースコードは機能しますが、私のトレーディングコードを改善しなければなりません。#プロパティの厳密さinput string NewsFilename = "novosti.txt"; // ニュースの入ったテキストファイルの名前input int MinutesBefore = 5; // ニュース公開の何分前に注文を出すかinput int MinutesAfter1 = 15; // ニュースリリースから何分後に第1グループの注文を削除するか。input int MinutesAfter2 = 30; // ニュースリリースから何分後にグループ2注文を削除するかinput int MinutesAfter3 = 30; // ニュースリリースから何分後にグループ3注文を削除するかinput int PriceIndent1 = 15; // 価格からのインデント(ポイント)input int PriceIndent2 = 5; // 前回のTakeProfitからのステップバックのポイント数input int TakeProfit1 = 40; // 第1グループのTakeProfitのサイズ(ポイント数input int TakeProfit2 = 60; // 第2グループのTakeProfitサイズ(ポイント数input int TakeProfit3 = 100; // 第3グループのTakeProfitサイズ(ポイント数input int StopLoss = 20; // すべての注文に対するストップロスのサイズ(ポイント単位input double Multiplier1 = 1.0; // 第2グループのオーダーロットに対する係数input double Multiplier2 = 2.0; // 第3グループのオーダーロットに対する係数input int MaximalRisk = 10; // 最大リスク(パーセンテージ).//====================================================================================================datetime Times[200]; // LastTime;文字列 Symbols[200];bool NewsPassed[200]。int NewsCount。//====================================================================================================int OnInit(){// 新鮮なニュースを読み込むif (!LoadNews()) return(INIT_FAILED);return(INIT_SUCCEEDED);}//====================================================================================================void OnTick(){if (!IsTradeAllowed()) return;datetime TestTime = iTime(Symbol(), PERIOD_H1, 0);// 毎日、冒頭のニュースを更新する。if (TimeDay(TestTime)!=TimeDay(LastTime))とする。{LastTime = TestTime;if (!LoadNews()){Alert("アップデートニュースエラー!");を返します。}}//-------------------------------------------------------------------------------------------------for (int i = 0; i < NewsCount; i++){ニュースリリースは、ブレイクスルーのための注文を置く// Till。if (Times[i] > TimeCurrent() && Times[i] - TimeCurrent() <= MinutesBefore * 60 && !NewsPassed[i])。{PrintFormat("current time is %s, it's time to set currency orders - %s", TimeToStr(TimeCurrent(), TIME_DATE|TIME_MINUTES), Symbols[i]);SetupOrders(Symbols[i];NewsPassed[i] = trueとする。}}//-------------------------------------------------------------------------------------------------}//====================================================================================================bool LoadNews(){int Count, Tick = 0;文字列Str、データ[40]。ResetLastError()。if (!FileIsExist(NewsFilename, 0)){PrintFormat("The news file %s does not exist", NewsFilename);Print("The file must be in folder \MQL4, in case of testing - in folder \Tester FilterFiles");return(false)です。}int Handle = FileOpen(NewsFilename, FILE_READ|FILE_SHARE_READ|FILE_TXT);if (Handle != INVALID_HANDLE){while (!FileIsEnding(Handle)){Str = FileReadString(Handle)。Count = StringSplit(Str, StringGetChar(" ", 0), Data);for (int i = 1; i < Count; i = i + 2){Times[Tick] = StringToTime(Data[0] + " + Data[i]);Symbols[Tick] = Data[i + 1];ダニ++。}}FileClose(Handle)です。NewsCount = Tick;for (int i = 0; i < NewsCount; i++){if (Times[i] > TimeCurrent())NewsPassed[i] = falseとする。else NewsPassed[i] = false;}PrintFormat("アップロードされたニュースの数 - %i.", NewsCount);return(true)です。}PrintFormat("Can't open file %s.エラーコード %d.", NewsFilename, GetLastError());return(false)です。}//====================================================================================================void SetupOrders(string Sym){int Ticket, Dig, Count;ダブルプライス、TP、SL、Lot。datetime KeepAlive = TimeCurrent() + (MinutesBefore + MinutesAfter1) * 60;文字列 SymList[7]。//-------------------------------------------------------------------------------------------------if (Sym == "AUD"){SymList[0] = "AUDCAD"; SymList[1] = "AUDCHF"; SymList[2] = "AUDJPY"; SymList[3] = "AUDNZD" とする。SymList[4] = "AUDUSD"; SymList[5] = "EURAUD"; SymList[6] = "GBPAUD "です。}//-------------------------------------------------------------------------------------------------if (Sym == "CAD"){SymList[0] = "AUDCAD"; SymList[1] = "CADCHF"; SymList[2] = "CADJPY"; SymList[3] = "EURCAD";SymList[4] = "GBPCAD"; SymList[5] = "NZDCAD"; SymList[6] = "USDCAD "です。}//-------------------------------------------------------------------------------------------------if (Sym == "CHF"){SymList[0] = "AUDCHF"; SymList[1] = "CADCHF"; SymList[2] = "EURCHF"; SymList[3] = "GBPCHF" とする。SymList[4] = "CHFJPY"; SymList[5] = "NZDCHF"; SymList[6] = "USDCHF";}//-------------------------------------------------------------------------------------------------if (Sym == "EUR"){SymList[0] = "EURAUD"; SymList[1] = "EURCAD"; SymList[2] = "EURCHF"; SymList[3] = "EURGBP";SymList[4] = "EURJPY"; SymList[5] = "EURNZD"; SymList[6] = "EURUSD";}//-------------------------------------------------------------------------------------------------if (Sym == "GBP"){SymList[0] = "EURGBP"; SymList[1] = "GBPAUD"; SymList[2] = "GBPCAD"; SymList[3] = "GBPCHF" です。SymList[4] = "GBPJPY"; SymList[5] = "GBPNZD"; SymList[6] = "GBPUSD "です。}//-------------------------------------------------------------------------------------------------if (Sym == "JPY"){SymList[0] = "AUDJPY"; SymList[1] = "CADJPY"; SymList[2] = "CHFJPY"; SymList[3] = "EURJPY";SymList[4] = "GBPJPY"; SymList[5] = "NZDJPY"; SymList[6] = "USDJPY";}//-------------------------------------------------------------------------------------------------if (Sym == "NZD"){SymList[0] = "AUDNZD"; SymList[1] = "EURNZD"; SymList[2] = "GBPNZD"; SymList[3] = "NZDCAD";SymList[4] = "NZDCHF"; SymList[5] = "NZDJPY"; SymList[6] = "NZDUSD "とする。}//-------------------------------------------------------------------------------------------------if (Sym == "USD"){SymList[0] = "AUSUSD"; SymList[1] = "EURUSD"; SymList[2] = "GBPUSD"; SymList[3] = "NZDUSD"。SymList[4] = "USDCAD"; SymList[5] = "USDCHF"; SymList[6] = "USDJPY "とする。}//-------------------------------------------------------------------------------------------------for (int i = 0; i < 7; i++){Count = 0;Dig = int(MarketInfo(SymList[i], MODE_DIGITS));Lot = NormalizeDouble(0.01, 2)。//購入KeepAlive = TimeCurrent() + (MinutesBefore + MinutesAfter1) * 60;価格 = NormalizeDouble(MarketInfo(SymList[i], MODE_ASK) + PriceIndent1 / pow(10, Dig-1), Dig)となります。TP = NormalizeDouble(Price + TakeProfit1 / pow(10, Dig-1), Dig)です。SL = NormalizeDouble(価格 - StopLoss / pow(10, Dig-1), Dig);チケット = OrderSend(SymList[i], OP_BUYSTOP, Lot, Price, 5, SL, TP, NULL, 0, KeepAlive, clrLimeGreen);if (Ticket > 0) Count++; else PrintFormat("Error creating order %i, symbol %s, price %f, Take %f, Stop %f, Lot %f.", GetLastError(), SymList[i], Price, TP, SL, Lot).注文の作成に失敗しました。KeepAlive = TimeCurrent() + (MinutesBefore + MinutesAfter2) * 60;価格 = NormalizeDouble(TP + PriceIndent2 / pow(10, Dig-1), Dig)。TP = NormalizeDouble(Price + TakeProfit2 / pow(10, Dig-1), Dig)です。SL = NormalizeDouble(価格 - StopLoss / pow(10, Dig-1), Dig);チケット = OrderSend(SymList[i], OP_BUYSTOP, Lot * Multiplier1, Price, 5, SL, TP, NULL, 0, KeepAlive, clrLimeGreen)です。if (Ticket > 0) Count++; else PrintFormat("Error creating order %i, symbol %s, price %f, Take %f, Stop %f, Lot %f.", GetLastError(), SymList[i], Price, TP, SL, Lot*Multiplier1).を参照。KeepAlive = TimeCurrent() + (MinutesBefore + MinutesAfter3) * 60;価格 = NormalizeDouble(TP + PriceIndent2 / pow(10, Dig-1), Dig)。TP = NormalizeDouble(Price + TakeProfit2 / pow(10, Dig-1), Dig)です。SL = NormalizeDouble(価格 - StopLoss / pow(10, Dig-1), Dig);チケット = OrderSend(SymList[i], OP_BUYSTOP, Lot*Multiplier2, Price, 5, SL, TP, NULL, 0, KeepAlive, clrLimeGreen)です。if (Ticket > 0) Count++; else PrintFormat("Error creating order %i, symbol %s, price %f, take %f, stop %f, lot %f.", GetLastError(), SymList[i], Price, TP, SL, Lot*Multiplier2).のようになります。// 販売KeepAlive = TimeCurrent() + (MinutesBefore + MinutesAfter1) * 60;価格 = NormalizeDouble(MarketInfo(SymList[i], MODE_BID) - PriceIndent1 / pow(10, Dig-1), Dig)となります。TP = NormalizeDouble(価格 - TakeProfit1 / pow(10, Dig-1), Dig);SL = NormalizeDouble(Price + StopLoss / pow(10, Dig-1), Dig)です。チケット = OrderSend(SymList[i], OP_SELLSTOP, Lot, Price, 5, SL, TP, NULL, 0, KeepAlive, clrOrangeRed);if (Ticket > 0) Count++; else PrintFormat("Error creating order %i, symbol %s, price %f, Take %f, Stop %f, Lot %f.", GetLastError(), SymList[i], Price, TP, SL, Lot).注文の作成に失敗しました。KeepAlive = TimeCurrent() + (MinutesBefore + MinutesAfter2) * 60;価格 = NormalizeDouble(TP - PriceIndent2 / pow(10, Dig-1), Dig)。TP = NormalizeDouble(価格 - TakeProfit2 / pow(10, Dig-1), Dig)。SL = NormalizeDouble(Price + StopLoss / pow(10, Dig-1), Dig)です。チケット = OrderSend(SymList[i], OP_SELLSTOP, Lot, Price, 5, SL, TP, NULL, 0, KeepAlive, clrOrangeRed);if (Ticket > 0) Count++; else PrintFormat("Error creating order %i, symbol %s, price %f, Take %f, Stop %f, Lot %f.", GetLastError(), SymList[i], Price, TP, SL, Lot*Multiplier1).のようになります。KeepAlive = TimeCurrent() + (MinutesBefore + MinutesAfter3) * 60;価格 = NormalizeDouble(TP - PriceIndent2 / pow(10, Dig-1), Dig)。TP = NormalizeDouble(価格 - TakeProfit3 / pow(10, Dig-1), Dig)。SL = NormalizeDouble(Price + StopLoss / pow(10, Dig-1), Dig)です。チケット = OrderSend(SymList[i], OP_SELLSTOP, Lot, Price, 5, SL, TP, NULL, 0, KeepAlive, clrOrangeRed);PrintFormat("There are %i orders placed by symbol %s", SymList[i], Count);0 }.}ニュースファイルはこのようなものです。2016.09.15 01:45 NZD 04:30 aud 10:30 chf 14:00 GBP 15:30 USD2016.09.16 15:30 USD 17:00 USDなどなど...。 Any rookie question, so [警告は閉鎖されました!】フォーラムを乱雑にしないために、どんな初心者の質問でも。プロフェッショナルは、通り過ぎないでください。あなたなしでは、どこにも行けない。 コーディングの方法は? Aleksandr Afanasenko 2016.09.15 05:49 #10958 A13ksandr:ソースコードに戻りましょう。こんな風に試してみてください。int OnInit(){if (!GlobalVariableCheck("AllowNewOrders")) GlobalVariableSet("AllowNewOrders",1).AllowNewOrders を設定します。 return(INIT_SUCCEED);}void OnDeInit(){GlobalVariableSet("AllowNewOrders",1)。}void OnTick(){if (CountTrades() == 0) // 注文数はゼロでなければなりません。{if ((TypeLastHistOrder() == OP_BUY && PriceCloseLastHistOrder(OP_BUY) < PriceOpenLastHistOrder(OP_BUY))|| (TypeLastHistOrder() == OP_SELL && PriceCloseLastHistOrder(OP_SELL) > PriceOpenLastHistOrder(OP_SELL))// 最後の取引が負けた場合、同じ取引が開始されますが、ロットは大きくなります。{GlobalVariableSet("AllowNewOrders", 0);Type = TypeLastHistOrder();if (Type == OP_BUY) Price = Ask;if (Type == OP_SELL) Price = Bid;Lot = NormalizeDouble(LotsLastHistOrder()*Multiplier, 2)です。ticket = OrderSend(Symbol(), Type, Lot, Price, Slippage, 0, 0, IntegerToString(Exp), Magic);}if (PriceCloseLastHistOrder() == PriceOpenLastHistOrder() && CountHistTrades() > 0)// 最後の取引の利益がゼロに等しい場合、同じ取引が開始されます。{GlobalVariableSet("AllowNewOrders", 0);Type = TypeLastHistOrder();if (Type == OP_BUY) Price = Ask;if (Type == OP_SELL) Price = Bid;Lot = NormalizeDouble(LotsLastHistOrder(), 2);ticket = OrderSend(Symbol(), Type, Lot, Price, Slippage, 0, 0, IntegerToString(Exp), Magic);}if (((TypeLastHistOrder() == OP_BUY && PriceCloseLastHistOrder(OP_BUY) > PriceOpenLastHistOrder(OP_BUY))|| (TypeLastHistOrder() == OP_SELL && PriceCloseLastHistOrder(OP_SELL) < PriceOpenLastHistOrder(OP_SELL))|| CountHistTrades() == 0)// 最後の取引で利益が出た場合、注文が開かれます。{if (GlobalVariableGet("AllowNewOrders") > 0)return;if (SignalBuy() && MaxOpenOrders > OrdersTotal()){ticket = OrderSend(Symbol(), OP_BUY, Lots, Ask, Slippage, 0, 0, IntegerToString(Exp), Magic)です。if (ticket>0) GlobalVariableSet("AllowNewOrders", 0);}if (SignalSell() && MaxOpenOrders > OrdersTotal()){ticket = OrderSend(Symbol(), OP_SELL, Lots, Bid, Slippage, 0, 0, IntegerToString(Exp), Magic)です。if (ticket>0) GlobalVariableSet("AllowNewOrders", 0);}}}}というのも、指値1本のEAを何本も使って、どのシンボルで(利益が出た後)売買を開始するのが良いのかが分からないからです?アレクサンダー、ボットは、一方向の各シンボルのローソクの指定された数を待ってから、シリーズを開始する必要があります、つまり、この条件は、そのシンボルのために最初にトリガされ、最初の取引を開始するシンボルで。同時に、最初のシリーズが利益を得るまで、他のシンボルのシリーズを開くことを禁止する必要があります。最後にご紹介したコードは、一歩進んだものです。このコードでは、ディールをまったく開きません(つまり、禁止事項が有効です)。なぜ皆無なのか、全く理解できていない。ログのスクリーンショットを添付します。 Nauris Zukas 2016.09.15 05:54 #10959 コードの入れ 方を勉強する時期かも!?int OnInit() { if (!GlobalVariableCheck("AllowNewOrders")) GlobalVariableSet("AllowNewOrders",1); return(INIT_SUCCEEDED); } void OnDeInit() { GlobalVariableSet("AllowNewOrders",1); } void OnTick() { if (CountTrades() == 0) // Количество ордеров должно равняться нулю { if ((TypeLastHistOrder() == OP_BUY && PriceCloseLastHistOrder(OP_BUY) < PriceOpenLastHistOrder(OP_BUY)) || (TypeLastHistOrder() == OP_SELL && PriceCloseLastHistOrder(OP_SELL) > PriceOpenLastHistOrder(OP_SELL))) // Если последняя сделка убыточная, то открывается такая же, но с увеличенным лотом { GlobalVariableSet("AllowNewOrders", 0); Type = TypeLastHistOrder(); if (Type == OP_BUY) Price = Ask; if (Type == OP_SELL) Price = Bid; Lot = NormalizeDouble(LotsLastHistOrder()*Multiplier, 2); ticket = OrderSend(Symbol(), Type, Lot, Price, Slippage, 0, 0, IntegerToString(Exp), Magic); } if (PriceCloseLastHistOrder() == PriceOpenLastHistOrder() && CountHistTrades() > 0) // Если прибыль последней сделки равняется нулю, то открывается такая же { GlobalVariableSet("AllowNewOrders", 0); Type = TypeLastHistOrder(); if (Type == OP_BUY) Price = Ask; if (Type == OP_SELL) Price = Bid; Lot = NormalizeDouble(LotsLastHistOrder(), 2); ticket = OrderSend(Symbol(), Type, Lot, Price, Slippage, 0, 0, IntegerToString(Exp), Magic); } if (((TypeLastHistOrder() == OP_BUY && PriceCloseLastHistOrder(OP_BUY) > PriceOpenLastHistOrder(OP_BUY)) || (TypeLastHistOrder() == OP_SELL && PriceCloseLastHistOrder(OP_SELL) < PriceOpenLastHistOrder(OP_SELL))) || CountHistTrades() == 0)// Если последняя сделка прибыльная, то открывается ордер { if (GlobalVariableGet("AllowNewOrders") > 0) return; if (SignalBuy() && MaxOpenOrders > OrdersTotal()) { ticket = OrderSend(Symbol(), OP_BUY, Lots, Ask, Slippage, 0, 0, IntegerToString(Exp), Magic); if (ticket>0) GlobalVariableSet("AllowNewOrders", 0); } if (SignalSell() && MaxOpenOrders > OrdersTotal()) { ticket = OrderSend(Symbol(), OP_SELL, Lots, Bid, Slippage, 0, 0, IntegerToString(Exp), Magic); if (ticket>0) GlobalVariableSet("AllowNewOrders", 0); } } } } 削除済み 2016.09.15 07:57 #10960 abeiks: コードの入れ方を勉強する時期かも!?int OnInit() // ИХМО так нагляднее { if (!GlobalVariableCheck("AllowNewOrders")) GlobalVariableSet("AllowNewOrders",1); return(INIT_SUCCEEDED); } void OnDeInit() { GlobalVariableSet("AllowNewOrders",1); } void OnTick() { if (CountTrades() == 0) // Количество ордеров должно равняться нулю { if ((TypeLastHistOrder() == OP_BUY && PriceCloseLastHistOrder(OP_BUY) < PriceOpenLastHistOrder(OP_BUY)) || (TypeLastHistOrder() == OP_SELL && PriceCloseLastHistOrder(OP_SELL) > PriceOpenLastHistOrder(OP_SELL))) // Если последняя сделка убыточная, то открывается такая же, но с увеличенным лотом { GlobalVariableSet("AllowNewOrders", 0); Type = TypeLastHistOrder(); if (Type == OP_BUY) Price = Ask; if (Type == OP_SELL) Price = Bid; Lot = NormalizeDouble(LotsLastHistOrder()*Multiplier, 2); ticket = OrderSend(Symbol(), Type, Lot, Price, Slippage, 0, 0, IntegerToString(Exp), Magic); } if (PriceCloseLastHistOrder() == PriceOpenLastHistOrder() && CountHistTrades() > 0) // Если прибыль последней сделки равняется нулю, то открывается такая же { GlobalVariableSet("AllowNewOrders", 0); Type = TypeLastHistOrder(); if (Type == OP_BUY) Price = Ask; if (Type == OP_SELL) Price = Bid; Lot = NormalizeDouble(LotsLastHistOrder(), 2); ticket = OrderSend(Symbol(), Type, Lot, Price, Slippage, 0, 0, IntegerToString(Exp), Magic); } if (((TypeLastHistOrder() == OP_BUY && PriceCloseLastHistOrder(OP_BUY) > PriceOpenLastHistOrder(OP_BUY)) || (TypeLastHistOrder() == OP_SELL && PriceCloseLastHistOrder(OP_SELL) < PriceOpenLastHistOrder(OP_SELL))) || CountHistTrades() == 0)// Если последняя сделка прибыльная, то открывается ордер { if (GlobalVariableGet("AllowNewOrders") > 0) return; if (SignalBuy() && MaxOpenOrders > OrdersTotal()) { ticket = OrderSend(Symbol(), OP_BUY, Lots, Ask, Slippage, 0, 0, IntegerToString(Exp), Magic); if (ticket>0) GlobalVariableSet("AllowNewOrders", 0); } if (SignalSell() && MaxOpenOrders > OrdersTotal()) { ticket = OrderSend(Symbol(), OP_SELL, Lots, Bid, Slippage, 0, 0, IntegerToString(Exp), Magic); if (ticket>0) GlobalVariableSet("AllowNewOrders", 0); } } } } 1...108910901091109210931094109510961097109810991100110111021103...1178 新しいコメント 取引の機会を逃しています。 無料取引アプリ 8千を超えるシグナルをコピー 金融ニュースで金融マーケットを探索 新規登録 ログイン スペースを含まないラテン文字 このメールにパスワードが送信されます エラーが発生しました Googleでログイン WebサイトポリシーおよびMQL5.COM利用規約に同意します。 新規登録 MQL5.com WebサイトへのログインにCookieの使用を許可します。 ログインするには、ブラウザで必要な設定を有効にしてください。 ログイン/パスワードをお忘れですか? Googleでログイン
こんにちは。
TPでポジションがクローズされたかどうかは、どのように判断するのですか?OrderClosePrice()==OrderTakeProfit()の使い方が 正しいとは思えません。
オーダーコメントで[tp]がある場合は、それを探してください。
注文の解説で、もしあれば[tp]を探してください...。
こんにちは、プロフィです。
help fix the error in the indicator......インジケーターのエラーを修正してください。
インジケーターが動作しています。
シグナルはバー0にトリガーされます。
しかし、現在のバーで他のティックが受信されると、再びトリガーされ、新しいシグナルが表示されます。
売りまたは買い-イベントが発生し、このオープンバーで他のイベントが処理されなかった場合、現在のイベント価格の場所にこのシグナルを丸で囲む必要があります。
このバーで新しいシグナルや円を出さないようにしたい。
________________________
ナンセンスだ、偽信号だなどと言われるのは承知していますが、これこそ私が必要としているものなのです。
旗や目印を作ればいいのは分かっているのですが......自分で言葉を勉強する時間がないんです。
_________________________
添付ファイルにそのようなフラグを追加し、追加した線に 色で印を付けて頂けるとありがたいのですが・・・・。
ありがとうございます、そして誰かが反応してくれることを願っています
何度かエラーを出し、修正できない。どうしたんですか?
//+------------------------------------------------------------------+ニュースを見て取引できるよう、よろしくお願いします。主に2つの機能を持つEAを必要としています。
最初の機能:指定されたTPとSLで、指定された時間に、指定されたレベルの価格で、保留中の注文を 出すことです。
2つ目の機能は、保留中の注文を価格と平行に保つことです。価格と一緒に移動させるということです(手動でやるのは面倒くさいので)。ある時間、ニュースが発表された瞬間に、このアクションを止め、価格がいずれかのオーダーに触れるまで待つ必要があるのです。その後、2回目の注文はすぐに削除されます。
もう一度言います。
ニュース発表の2分前に、価格から10ポイント離れた場所に2つの逆指値注文を入れ、すぐに価格と平行に移動する機能を作動させ、2分後に価格と一緒に移動し、一方の注文は価格から逃げ、もう一方は価格に追いつく。ニュースリリースでは、注文移動待ちの機能を無効にしてから、いずれかの注文の内訳を待つ必要があります。2つ目の注文は、1つ目の注文が壊れた直後に削除されます。
EAのプロパティで変更される変数(だいたい想像で、現実の実感は分かりませんが)
TP - 600 (デフォルト)
トロール - 300(デフォルト)
SL - 100(デフォルト)
Pips - 100 (デフォルトでは価格からの距離)
スリッページ - 100 (デフォルトではpips単位のスリッページ)
ロット - 0.1
リスク - 10 // パーセント(まあ、これは必要ないので、必要なら後で聞きますが。)
TimeNews1On - true (下のセルを使って時間を入力、false - advisorはそれらを取引しない)
TimeNewsHour - 時間 (ニュースリリース時間 1)
TimeNewsMin - 分 (ニュースリリース時間1)
TimeNews2On - false (デフォルト)
TimeNewsHour - 時間 (ニュースリリース時間 2)
TimeNewsMin - 分 (ニュースリリース時間2)
TimeNews3On - false
TimeNewsHour - 時間 (ニュースリリース時間 3)
TimeNewsMin - 分 (ニュースリリース時間3)
TimeNews4On - false
TimeNewsHour - 時間 (ニュースリリース時間 4)
TimeNewsMin - 分 (ニュースリリース時間4)
TimeNews5On - false
TimeNewsHour - 時間 (ニュースリリース時間 5)
TimeNewsMin - 分 (ニュースリリース時間5)
インスタ、5桁。
私はこれをすべて手作業でやっているのですが、面倒くさいし、今はニュースを解決する時間がないので、その日にニュースがあるペアに朝か夜にExpert Advisorを置きたいので、すべて解決します。
--------------------------------------
そのような専門家をご存知の方は、ぜひ教えてください。
ありがとうございました。
ソースコードに戻りましょう。こんな風に試してみてください。
int OnInit()
{
if (!GlobalVariableCheck("AllowNewOrders")) GlobalVariableSet("AllowNewOrders",1).AllowNewOrders を設定します。
return(INIT_SUCCEED);
}
void OnDeInit()
{
GlobalVariableSet("AllowNewOrders",1)。
}
void OnTick()
{
if (CountTrades() == 0) // 注文数はゼロでなければなりません。
{
if ((TypeLastHistOrder() == OP_BUY && PriceCloseLastHistOrder(OP_BUY) < PriceOpenLastHistOrder(OP_BUY))
|| (TypeLastHistOrder() == OP_SELL && PriceCloseLastHistOrder(OP_SELL) > PriceOpenLastHistOrder(OP_SELL))
// 最後の取引が負けた場合、同じ取引が開始されますが、ロットは大きくなります。
{
GlobalVariableSet("AllowNewOrders", 0);
Type = TypeLastHistOrder();
if (Type == OP_BUY) Price = Ask;
if (Type == OP_SELL) Price = Bid;
Lot = NormalizeDouble(LotsLastHistOrder()*Multiplier, 2)です。
ticket = OrderSend(Symbol(), Type, Lot, Price, Slippage, 0, 0, IntegerToString(Exp), Magic);
}
if (PriceCloseLastHistOrder() == PriceOpenLastHistOrder() && CountHistTrades() > 0)
//最後の取引の利益が ゼロに等しい場合、同じ取引が開始されます。
{
GlobalVariableSet("AllowNewOrders", 0);
Type = TypeLastHistOrder();
if (Type == OP_BUY) Price = Ask;
if (Type == OP_SELL) Price = Bid;
Lot = NormalizeDouble(LotsLastHistOrder(), 2);
ticket = OrderSend(Symbol(), Type, Lot, Price, Slippage, 0, 0, IntegerToString(Exp), Magic);
}
if (((TypeLastHistOrder() == OP_BUY && PriceCloseLastHistOrder(OP_BUY) > PriceOpenLastHistOrder(OP_BUY))
|| (TypeLastHistOrder() == OP_SELL && PriceCloseLastHistOrder(OP_SELL) < PriceOpenLastHistOrder(OP_SELL))
|| CountHistTrades() == 0)// 最後の取引で利益が出た場合、注文が開かれます。
{
if (GlobalVariableGet("AllowNewOrders") > 0)return;
if (SignalBuy() && MaxOpenOrders > OrdersTotal())
{
ticket = OrderSend(Symbol(), OP_BUY, Lots, Ask, Slippage, 0, 0, IntegerToString(Exp), Magic)です。
if (ticket>0) GlobalVariableSet("AllowNewOrders", 0);
}
if (SignalSell() && MaxOpenOrders > OrdersTotal())
{
ticket = OrderSend(Symbol(), OP_SELL, Lots, Bid, Slippage, 0, 0, IntegerToString(Exp), Magic)です。
if (ticket>0) GlobalVariableSet("AllowNewOrders", 0);
}
}
}
}
注文の総指値が1つのEAを複数枚使うと、どのシンボルで(利益が出た後に)取引を開始するのが良いのかが分からないので、確認していません。
ニュースでの取引にお役立てください。主に2つの機能を持つEAが必要です。
最初の機能:指定されたTPとSLで、指定された時間に、価格から指定されたレベルで、保留中の注文を 出すことです。
2つ目の機能は、保留中の注文を価格と平行に保つことです。価格と一緒に移動させるということです(手動でやるのは面倒なので)。ある時間、ニュースが発表された瞬間に、このアクションを止め、価格がいずれかのオーダーに触れるまで待つ必要があるのです。その後、2回目の注文はすぐに削除されます。
もう一度言います。
ニュース発表の2分前に、価格から10ポイント離れた場所に2つの逆指値注文を入れ、すぐに価格と平行に移動する機能を作動させ、2分後に価格と一緒に移動し、一方の注文は価格から逃げ、もう一方は価格に追いつきます。ニュースリリースでは、注文移動待ちの機能を無効にしてから、いずれかの注文の内訳を待つ必要があります。2枚目は1枚目の故障後、すぐに削除されます。
そのようなアドバイザーをご存知の方、またはお会いしたことのある方は、ぜひ教えてください。
ありがとうございました。
ファイルからニュースを読み取るコードを送りますので、便利かもしれませんね。週に一度、経済カレンダーを見て、あなたが注意を払うべきニュースのファイルfolder_with_terminalMQL4㏄Filesnovosti.txtにデータを入力して、アドバイザーは、ニュースの直前でも有効にすることができます(あなたが強い動きがある場合に、例えば、アメリカのセッション - の始まりを追跡するのにこの顧問を使うことができます)。ニュースで何度か本気で「だまされた」ので、トレーディングコードは完成してません :))最新バージョンでは、6つの注文(買いストップ3つ+売りストップ3つ)を異なる距離で、異なるTake Profitで発注しました。とにかく、私のニュースコードは機能しますが、私のトレーディングコードを改善しなければなりません。
#プロパティの厳密さ
input string NewsFilename = "novosti.txt"; // ニュースの入ったテキストファイルの名前
input int MinutesBefore = 5; // ニュース公開の何分前に注文を出すか
input int MinutesAfter1 = 15; // ニュースリリースから何分後に第1グループの注文を削除するか。
input int MinutesAfter2 = 30; // ニュースリリースから何分後にグループ2注文を削除するか
input int MinutesAfter3 = 30; // ニュースリリースから何分後にグループ3注文を削除するか
input int PriceIndent1 = 15; // 価格からのインデント(ポイント)
input int PriceIndent2 = 5; // 前回のTakeProfitからのステップバックのポイント数
input int TakeProfit1 = 40; // 第1グループのTakeProfitのサイズ(ポイント数
input int TakeProfit2 = 60; // 第2グループのTakeProfitサイズ(ポイント数
input int TakeProfit3 = 100; // 第3グループのTakeProfitサイズ(ポイント数
input int StopLoss = 20; // すべての注文に対するストップロスのサイズ(ポイント単位
input double Multiplier1 = 1.0; // 第2グループのオーダーロットに対する係数
input double Multiplier2 = 2.0; // 第3グループのオーダーロットに対する係数
input int MaximalRisk = 10; // 最大リスク(パーセンテージ).
//====================================================================================================
datetime Times[200]; // LastTime;
文字列 Symbols[200];
bool NewsPassed[200]。
int NewsCount。
//====================================================================================================
int OnInit()
{
// 新鮮なニュースを読み込む
if (!LoadNews()) return(INIT_FAILED);
return(INIT_SUCCEEDED);
}
//====================================================================================================
void OnTick()
{
if (!IsTradeAllowed()) return;
datetime TestTime = iTime(Symbol(), PERIOD_H1, 0);
// 毎日、冒頭のニュースを更新する。
if (TimeDay(TestTime)!=TimeDay(LastTime))とする。
{
LastTime = TestTime;
if (!LoadNews())
{
Alert("アップデートニュースエラー!");
を返します。
}
}
//-------------------------------------------------------------------------------------------------
for (int i = 0; i < NewsCount; i++)
{
ニュースリリースは、ブレイクスルーのための注文を置く// Till。
if (Times[i] > TimeCurrent() && Times[i] - TimeCurrent() <= MinutesBefore * 60 && !NewsPassed[i])。
{
PrintFormat("current time is %s, it's time to set currency orders - %s", TimeToStr(TimeCurrent(), TIME_DATE|TIME_MINUTES), Symbols[i]);
SetupOrders(Symbols[i];
NewsPassed[i] = trueとする。
}
}
//-------------------------------------------------------------------------------------------------
}
//====================================================================================================
bool LoadNews()
{
int Count, Tick = 0;
文字列Str、データ[40]。
ResetLastError()。
if (!FileIsExist(NewsFilename, 0))
{
PrintFormat("The news file %s does not exist", NewsFilename);
Print("The file must be in folder \MQL4, in case of testing - in folder \Tester FilterFiles");
return(false)です。
}
int Handle = FileOpen(NewsFilename, FILE_READ|FILE_SHARE_READ|FILE_TXT);
if (Handle != INVALID_HANDLE)
{
while (!FileIsEnding(Handle))
{
Str = FileReadString(Handle)。
Count = StringSplit(Str, StringGetChar(" ", 0), Data);
for (int i = 1; i < Count; i = i + 2)
{
Times[Tick] = StringToTime(Data[0] + " + Data[i]);
Symbols[Tick] = Data[i + 1];
ダニ++。
}
}
FileClose(Handle)です。
NewsCount = Tick;
for (int i = 0; i < NewsCount; i++)
{
if (Times[i] > TimeCurrent())NewsPassed[i] = falseとする。
else NewsPassed[i] = false;
}
PrintFormat("アップロードされたニュースの数 - %i.", NewsCount);
return(true)です。
}
PrintFormat("Can't open file %s.エラーコード %d.", NewsFilename, GetLastError());
return(false)です。
}
//====================================================================================================
void SetupOrders(string Sym)
{
int Ticket, Dig, Count;
ダブルプライス、TP、SL、Lot。
datetime KeepAlive = TimeCurrent() + (MinutesBefore + MinutesAfter1) * 60;
文字列 SymList[7]。
//-------------------------------------------------------------------------------------------------
if (Sym == "AUD")
{
SymList[0] = "AUDCAD"; SymList[1] = "AUDCHF"; SymList[2] = "AUDJPY"; SymList[3] = "AUDNZD" とする。
SymList[4] = "AUDUSD"; SymList[5] = "EURAUD"; SymList[6] = "GBPAUD "です。
}
//-------------------------------------------------------------------------------------------------
if (Sym == "CAD")
{
SymList[0] = "AUDCAD"; SymList[1] = "CADCHF"; SymList[2] = "CADJPY"; SymList[3] = "EURCAD";
SymList[4] = "GBPCAD"; SymList[5] = "NZDCAD"; SymList[6] = "USDCAD "です。
}
//-------------------------------------------------------------------------------------------------
if (Sym == "CHF")
{
SymList[0] = "AUDCHF"; SymList[1] = "CADCHF"; SymList[2] = "EURCHF"; SymList[3] = "GBPCHF" とする。
SymList[4] = "CHFJPY"; SymList[5] = "NZDCHF"; SymList[6] = "USDCHF";
}
//-------------------------------------------------------------------------------------------------
if (Sym == "EUR")
{
SymList[0] = "EURAUD"; SymList[1] = "EURCAD"; SymList[2] = "EURCHF"; SymList[3] = "EURGBP";
SymList[4] = "EURJPY"; SymList[5] = "EURNZD"; SymList[6] = "EURUSD";
}
//-------------------------------------------------------------------------------------------------
if (Sym == "GBP")
{
SymList[0] = "EURGBP"; SymList[1] = "GBPAUD"; SymList[2] = "GBPCAD"; SymList[3] = "GBPCHF" です。
SymList[4] = "GBPJPY"; SymList[5] = "GBPNZD"; SymList[6] = "GBPUSD "です。
}
//-------------------------------------------------------------------------------------------------
if (Sym == "JPY")
{
SymList[0] = "AUDJPY"; SymList[1] = "CADJPY"; SymList[2] = "CHFJPY"; SymList[3] = "EURJPY";
SymList[4] = "GBPJPY"; SymList[5] = "NZDJPY"; SymList[6] = "USDJPY";
}
//-------------------------------------------------------------------------------------------------
if (Sym == "NZD")
{
SymList[0] = "AUDNZD"; SymList[1] = "EURNZD"; SymList[2] = "GBPNZD"; SymList[3] = "NZDCAD";
SymList[4] = "NZDCHF"; SymList[5] = "NZDJPY"; SymList[6] = "NZDUSD "とする。
}
//-------------------------------------------------------------------------------------------------
if (Sym == "USD")
{
SymList[0] = "AUSUSD"; SymList[1] = "EURUSD"; SymList[2] = "GBPUSD"; SymList[3] = "NZDUSD"。
SymList[4] = "USDCAD"; SymList[5] = "USDCHF"; SymList[6] = "USDJPY "とする。
}
//-------------------------------------------------------------------------------------------------
for (int i = 0; i < 7; i++)
{
Count = 0;
Dig = int(MarketInfo(SymList[i], MODE_DIGITS));
Lot = NormalizeDouble(0.01, 2)。
//購入
KeepAlive = TimeCurrent() + (MinutesBefore + MinutesAfter1) * 60;
価格 = NormalizeDouble(MarketInfo(SymList[i], MODE_ASK) + PriceIndent1 / pow(10, Dig-1), Dig)となります。
TP = NormalizeDouble(Price + TakeProfit1 / pow(10, Dig-1), Dig)です。
SL = NormalizeDouble(価格 - StopLoss / pow(10, Dig-1), Dig);
チケット = OrderSend(SymList[i], OP_BUYSTOP, Lot, Price, 5, SL, TP, NULL, 0, KeepAlive, clrLimeGreen);
if (Ticket > 0) Count++; else PrintFormat("Error creating order %i, symbol %s, price %f, Take %f, Stop %f, Lot %f.", GetLastError(), SymList[i], Price, TP, SL, Lot).注文の作成に失敗しました。
KeepAlive = TimeCurrent() + (MinutesBefore + MinutesAfter2) * 60;
価格 = NormalizeDouble(TP + PriceIndent2 / pow(10, Dig-1), Dig)。
TP = NormalizeDouble(Price + TakeProfit2 / pow(10, Dig-1), Dig)です。
SL = NormalizeDouble(価格 - StopLoss / pow(10, Dig-1), Dig);
チケット = OrderSend(SymList[i], OP_BUYSTOP, Lot * Multiplier1, Price, 5, SL, TP, NULL, 0, KeepAlive, clrLimeGreen)です。
if (Ticket > 0) Count++; else PrintFormat("Error creating order %i, symbol %s, price %f, Take %f, Stop %f, Lot %f.", GetLastError(), SymList[i], Price, TP, SL, Lot*Multiplier1).を参照。
KeepAlive = TimeCurrent() + (MinutesBefore + MinutesAfter3) * 60;
価格 = NormalizeDouble(TP + PriceIndent2 / pow(10, Dig-1), Dig)。
TP = NormalizeDouble(Price + TakeProfit2 / pow(10, Dig-1), Dig)です。
SL = NormalizeDouble(価格 - StopLoss / pow(10, Dig-1), Dig);
チケット = OrderSend(SymList[i], OP_BUYSTOP, Lot*Multiplier2, Price, 5, SL, TP, NULL, 0, KeepAlive, clrLimeGreen)です。
if (Ticket > 0) Count++; else PrintFormat("Error creating order %i, symbol %s, price %f, take %f, stop %f, lot %f.", GetLastError(), SymList[i], Price, TP, SL, Lot*Multiplier2).のようになります。
// 販売
KeepAlive = TimeCurrent() + (MinutesBefore + MinutesAfter1) * 60;
価格 = NormalizeDouble(MarketInfo(SymList[i], MODE_BID) - PriceIndent1 / pow(10, Dig-1), Dig)となります。
TP = NormalizeDouble(価格 - TakeProfit1 / pow(10, Dig-1), Dig);
SL = NormalizeDouble(Price + StopLoss / pow(10, Dig-1), Dig)です。
チケット = OrderSend(SymList[i], OP_SELLSTOP, Lot, Price, 5, SL, TP, NULL, 0, KeepAlive, clrOrangeRed);
if (Ticket > 0) Count++; else PrintFormat("Error creating order %i, symbol %s, price %f, Take %f, Stop %f, Lot %f.", GetLastError(), SymList[i], Price, TP, SL, Lot).注文の作成に失敗しました。
KeepAlive = TimeCurrent() + (MinutesBefore + MinutesAfter2) * 60;
価格 = NormalizeDouble(TP - PriceIndent2 / pow(10, Dig-1), Dig)。
TP = NormalizeDouble(価格 - TakeProfit2 / pow(10, Dig-1), Dig)。
SL = NormalizeDouble(Price + StopLoss / pow(10, Dig-1), Dig)です。
チケット = OrderSend(SymList[i], OP_SELLSTOP, Lot, Price, 5, SL, TP, NULL, 0, KeepAlive, clrOrangeRed);
if (Ticket > 0) Count++; else PrintFormat("Error creating order %i, symbol %s, price %f, Take %f, Stop %f, Lot %f.", GetLastError(), SymList[i], Price, TP, SL, Lot*Multiplier1).のようになります。
KeepAlive = TimeCurrent() + (MinutesBefore + MinutesAfter3) * 60;
価格 = NormalizeDouble(TP - PriceIndent2 / pow(10, Dig-1), Dig)。
TP = NormalizeDouble(価格 - TakeProfit3 / pow(10, Dig-1), Dig)。
SL = NormalizeDouble(Price + StopLoss / pow(10, Dig-1), Dig)です。
チケット = OrderSend(SymList[i], OP_SELLSTOP, Lot, Price, 5, SL, TP, NULL, 0, KeepAlive, clrOrangeRed);
PrintFormat("There are %i orders placed by symbol %s", SymList[i], Count);0 }.
}
ニュースファイルはこのようなものです。
2016.09.15 01:45 NZD 04:30 aud 10:30 chf 14:00 GBP 15:30 USD
2016.09.16 15:30 USD 17:00 USD
などなど...。
ソースコードに戻りましょう。こんな風に試してみてください。
int OnInit()
{
if (!GlobalVariableCheck("AllowNewOrders")) GlobalVariableSet("AllowNewOrders",1).AllowNewOrders を設定します。
return(INIT_SUCCEED);
}
void OnDeInit()
{
GlobalVariableSet("AllowNewOrders",1)。
}
void OnTick()
{
if (CountTrades() == 0) // 注文数はゼロでなければなりません。
{
if ((TypeLastHistOrder() == OP_BUY && PriceCloseLastHistOrder(OP_BUY) < PriceOpenLastHistOrder(OP_BUY))
|| (TypeLastHistOrder() == OP_SELL && PriceCloseLastHistOrder(OP_SELL) > PriceOpenLastHistOrder(OP_SELL))
// 最後の取引が負けた場合、同じ取引が開始されますが、ロットは大きくなります。
{
GlobalVariableSet("AllowNewOrders", 0);
Type = TypeLastHistOrder();
if (Type == OP_BUY) Price = Ask;
if (Type == OP_SELL) Price = Bid;
Lot = NormalizeDouble(LotsLastHistOrder()*Multiplier, 2)です。
ticket = OrderSend(Symbol(), Type, Lot, Price, Slippage, 0, 0, IntegerToString(Exp), Magic);
}
if (PriceCloseLastHistOrder() == PriceOpenLastHistOrder() && CountHistTrades() > 0)
// 最後の取引の利益がゼロに等しい場合、同じ取引が開始されます。
{
GlobalVariableSet("AllowNewOrders", 0);
Type = TypeLastHistOrder();
if (Type == OP_BUY) Price = Ask;
if (Type == OP_SELL) Price = Bid;
Lot = NormalizeDouble(LotsLastHistOrder(), 2);
ticket = OrderSend(Symbol(), Type, Lot, Price, Slippage, 0, 0, IntegerToString(Exp), Magic);
}
if (((TypeLastHistOrder() == OP_BUY && PriceCloseLastHistOrder(OP_BUY) > PriceOpenLastHistOrder(OP_BUY))
|| (TypeLastHistOrder() == OP_SELL && PriceCloseLastHistOrder(OP_SELL) < PriceOpenLastHistOrder(OP_SELL))
|| CountHistTrades() == 0)// 最後の取引で利益が出た場合、注文が開かれます。
{
if (GlobalVariableGet("AllowNewOrders") > 0)return;
if (SignalBuy() && MaxOpenOrders > OrdersTotal())
{
ticket = OrderSend(Symbol(), OP_BUY, Lots, Ask, Slippage, 0, 0, IntegerToString(Exp), Magic)です。
if (ticket>0) GlobalVariableSet("AllowNewOrders", 0);
}
if (SignalSell() && MaxOpenOrders > OrdersTotal())
{
ticket = OrderSend(Symbol(), OP_SELL, Lots, Bid, Slippage, 0, 0, IntegerToString(Exp), Magic)です。
if (ticket>0) GlobalVariableSet("AllowNewOrders", 0);
}
}
}
}
というのも、指値1本のEAを何本も使って、どのシンボルで(利益が出た後)売買を開始するのが良いのかが分からないからです?
アレクサンダー、ボットは、一方向の各シンボルのローソクの指定された数を待ってから、シリーズを開始する必要があります、つまり、この条件は、そのシンボルのために最初にトリガされ、最初の取引を開始するシンボルで。同時に、最初のシリーズが利益を得るまで、他のシンボルのシリーズを開くことを禁止する必要があります。
最後にご紹介したコードは、一歩進んだものです。このコードでは、ディールをまったく開きません(つまり、禁止事項が有効です)。なぜ皆無なのか、全く理解できていない。ログのスクリーンショットを添付します。
コードの入れ 方を勉強する時期かも!?