if (!ExistPositions("", Sell, MagicNumber)) { // вместо Sell должно быть OP_SELL или 1double sl, tp;
if (Sell) {
if (StopLoss>0) sl=Bid+StopLoss*Point; else sl=0;
if (TakeProfit>0) tp=Bid-TakeProfit*Point; else tp=0;
}
else { // Это расчёт для OP_BUY - зачем он тут?if (StopLoss>0) sl=Ask-StopLoss*Point; else sl=0;
if (TakeProfit>0) tp=Ask+TakeProfit*Point; else tp=0;
}
OpenPosition("", Sell, Lots, sl, tp, MagicNumber); // вместо Sell должно быть OP_SELL или 1
} // ну и, если нужен Buy, то OP_BUY или 0
次のことを提案することができます、アカウントにN個のEAがあり、特定の条件の下ですべての注文を同時に開くことができ、それらの各々は、アカウントに1以上の注文をチェックしますが、時々私はN個の注文で終わる、私は何をすることができますか?
そのような場合、彼らは おそらく理由を推測し、リモートで解決策を提案するでしょう;)
こんにちは、また最後の注文でストップを置くことについて質問をさせてください。
テスターでは、最後の注文にストップがかからないことがあることを明確にしたいです。
フォワードテストでは、今のところこのようなことは起こっていません。 しかし、よく言われるように、なぜ待つのでしょうか?)
コード
次のことを提案することができます、アカウントにN個のEAがあり、特定の条件の下ですべての注文を同時に開くことができ、それらの各々は、アカウントに1以上の注文をチェックしますが、時々私はN個の注文で終わる、私は何をすることができますか?
記事を読む
トレードの合間のポーズ
146エラー("Trade flow busy")とその対処 法記事を読む
トレードの合間のポーズ
146エラー("Trade flow busy")とその対処 法ありがとうございます!!!
本当にこの部分が問題の原因なのでしょうか?未知の変数がたくさんあり、開口部そのものを見ることができないのですから、この内容から結論を出すのは困難です。
自分で原因を調べるには、変数の値をコメント付きで印刷または表示します。そうすれば、いつでもその値を見ることができるようになります。
金氏のeOpenByTime Expert Advisorがベースになっています。また、トレーリングストップを追加し、週明けにはクローズし、ある曜日にはオープンするようにしました。この形態では、Expert Advisorはあるべき姿で動作します。
ディールオープニングは次のように行われます。ディールオープニングの週の日だけを追加しましたが、ここで失敗することはありません。
if (DayOfWeek()==DayOfWeekOpen && TimeCurrent()>=StrToTime(TimeToStr(TimeCurrent(), TIME_DATE)+" "+TimeTradeOpen) && TimeCurrent()<StrToTime(TimeToStr(TimeCurrent(), TIME_DATE)+" "+TimeTradeOpen)+Duration) { if (!ExistPositions("", Sell, MagicNumber)) { double sl, tp; if (Sell) { if (StopLoss>0) sl=Bid+StopLoss*Point; else sl=0; if (TakeProfit>0) tp=Bid-TakeProfit*Point; else tp=0; } else { if (StopLoss>0) sl=Ask-StopLoss*Point; else sl=0; if (TakeProfit>0) tp=Ask+TakeProfit*Point; else tp=0; } OpenPosition("", Sell, Lots, sl, tp, MagicNumber); } }正直なところ、TimeCurrentとTimeCurrent + TimeTradeOpen(TimeTradeOpenはTimeTradeOpen = "19:51 "という型の外部パラメータ)を比較する理由がよくわかりません。(また、なぜこの比較が有効なのか理解できない。期間とは、Expert Advisorがポジションを開こうとする時間です。
例えるなら、金曜日にポジションの決済を追加したようなものです。
ここまでは、すべてがうまくいっていた。
そこで、ある時間、ある曜日のローソク足を見て、強気なら売り、弱気なら買いの条件を加えたいと思いました。
同じように、この3行をコピーしたところ、以前はうまくいっていたのに、なぜか今はうまくいかなくなりました。
その後、ポジションオープンのコードが続きます。TimeTradeIfも同様の形式でTimeTradeIf = "19:51 "となり、外部パラメータで設定される。
コード全体がかなり長いのですが、挿入する必要がありますか?
こんにちは、また最後の注文でストップを置くことについて質問をさせてください。
テスターでは、最後の注文にストップがかからないことがあることを明確にしたいです。
フォワードテストでは、今のところこのようなことは起こっていません。 しかし、よく言われるように、なぜ待つのでしょうか?)
コード
問題を発見。コードはOK。不可能を可能にするのは作家だ))
これは、尊敬するキム氏のeOpenByTime Expert Advisorをベースにしています。また、トレーリングストップを追加し、週明けにはクローズし、ある曜日にはオープンするようにしました。この形態では、EAが本来の機能を発揮します。
ディールオープンは以下のように行われます。ディールオープンの曜日だけを追加していますが、ここで失敗することはありません。
正直なところ、TimeCurrent と TimeCurrent + TimeTradeOpen を比較して、TimeTradeOpen が TimeTradeOpen = "19:51" タイプの外部パラメータである理由がよくわからない。(また、なぜこの比較が有効なのか理解できない。期間とは、Expert Advisorがポジションを開こうとする時間です。
例えるなら、金曜日にポジションの決済を追加したようなものです。
ここまでは、すべてがうまくいっていた。
そこで、ある時間、ある曜日のローソク足を見て、強気なら売り、弱気なら買いの条件を加えたいと思いました。
同じように、この3行をコピーしたところ、以前はうまくいっていたのに、なぜか今はうまくいかなくなりました。
その後、ポジションオープンのコードが続きます。TimeTradeIfも同様の形式でTimeTradeIf = "19:51 "となり、外部パラメータで設定される。
コード全体がかなり長いのですが、貼り付けたほうがいいでしょうか?
正直なところ、何が問題なのか、もう忘れてしまっているんです。このコード部分では、ショートポジションのみがチェックされ、ショートポジションのオープニングも指定されていますね。
正直なところ、何が問題なのか忘れてしまった。このコードセクションでは、ショートポジションのみがチェックされ、ショートポジションのみがオープンされていますね。
Sell変数は外部変数で、それぞれtrueかfalse、1か0を含む。
キムさんのはeOpenByTime です。
論理、行動のアルゴリズムに欠陥があるのです。
もし彼がstart()関数と変数、それらが運ぶものを捨ててくれるなら、私たちは何かを提案することができます。
Artemさん、その通りです。Sell変数は外部変数で、それぞれtrueかfalse、1か0かの値を持ちます。
キムさんの、eOpenByTimeを 拝見しました。
論理、行動のアルゴリズムに欠陥があるのです。
もし彼がstart()関数と変数、それらが担うものを示してくれるなら、私たちは何かを提案することができます。
考え方はこうです:ある時間TimeTradeIfで、あるDayOfWeekIfでローソクが強気なら、Sell = true(売り)、弱気なら、Sell = false(買い)です。
そのはずなんですが、テストでは売り物のトレードしか出てこないんです。
eOpenByTimeは指定した時間にディールを開くことができるので、指定した曜日に追加しました if (DayOfWeek()==DayOfWeekOpen, ここで DayOfWeekOpen = 1,2,3,4,5)
コードを2つに分けて添付しています、他に方法はありません、問題のある条件を強調しました。つまり、「売り」を設定し、適切な曜日の適切な時間に取引を開始するのです。
トロールだけが切り取られている。
//+----------------------------------------------------------------------------+ //| e-OpenByTime.mq4 | //| | //| Идея : Владимир, sibtrade@hotbox.ru | //| Реализация: Ким Игорь В. aka KimIV, http://www.kimiv.ru | //| | //| 2007.04.27 Открытие позиции в заданное время. | //| 2008.04.10 Параметр MarketWatch. | //| 2008.04.14 Параметр Duration. | //+----------------------------------------------------------------------------+ #property copyright "Владимир & KimIV" #property link "http://www.kimiv.ru" //------- Внешние параметры советника -----------------------------------------+ extern string _P_Trade = "---------- Параметры торговли"; extern int DayOfWeekOpen = 3; // День недели открытия позиции extern string TimeTradeOpen = "19:51"; // Время открытия позиции extern int DayOfWeekIf = 3; // День недели условия extern string TimeTradeIf = "19:51"; // Время условия extern int DayOfWeekClose = 5; // День недели закрытия позиции extern string TimeTradeClose = "19:51"; // Время закрытия позиции extern int Duration = 300; // Продолжительность в секундах //extern bool Sell = False; // True-Sell, False-Buy extern double Lots = 0.1; // Размер лота extern int StopLoss = 30; // Размер стопа в пунктах extern int TakeProfit = 60; // Размер тейка в пунктах extern string _P_Expert = "---------- Параметры советника"; extern int MagicNumber = 0; extern int NumberAccount = 0; // Номер торгового счёта extern bool UseSound = True; // Использовать звуковой сигнал extern string NameFileSound = "expert.wav"; // Наименование звукового файла extern bool ShowComment = True; // Показывать комментарий extern bool MarketWatch = True; // Запросы под исполнение "Market Watch". extern int Slippage = 3; // Проскальзывание цены extern int NumberOfTry = 5; // Количество торговых попыток //------- Глобальные переменные советника -------------------------------------+ bool gbDisabled = False; // Флаг блокировки советника bool gbNoInit = False; // Флаг неудачной инициализации color clOpenBuy = LightBlue; // Цвет значка открытия покупки color clOpenSell = LightCoral; // Цвет значка открытия продажи bool Sell; //------- Подключение внешних модулей -----------------------------------------+ #include <stdlib.mqh> // Стандартная библиотека МТ4 //int deinit() // { //---- //---- // return(0); // } //+----------------------------------------------------------------------------+ //| | //| ПРЕДОПРЕДЕЛЁННЫЕ ФУНКЦИИ | //| | //+----------------------------------------------------------------------------+ //| Функция инициализации | //+----------------------------------------------------------------------------+ void init() { gbNoInit=False; if (!IsTradeAllowed()) { Message("Для нормальной работы советника необходимо\n"+ "Разрешить советнику торговать"); gbNoInit=True; return; } if (!IsLibrariesAllowed()) { Message("Для нормальной работы советника необходимо\n"+ "Разрешить импорт из внешних экспертов"); gbNoInit=True; return; } if (!IsTesting()) { if (IsExpertEnabled()) Message("Советник будет запущен следующим тиком"); else Message("Отжата кнопка \"Разрешить запуск советников\""); } } //+----------------------------------------------------------------------------+ //| Функция деинициализации | //+----------------------------------------------------------------------------+ void deinit() { if (!IsTesting()) Comment(""); ObjectDelete("SLb"); //Трейлингстоп ObjectDelete("SLs"); //Трейлингстоп return(0); } //+----------------------------------------------------------------------------+ //| expert start function | //+----------------------------------------------------------------------------+ void start() { if (gbDisabled) { Message("Критическая ошибка! Советник ОСТАНОВЛЕН!"); return; } if (gbNoInit) { Message("Не удалось инициализировать советник!"); return; } if (!IsTesting()) { if (NumberAccount>0 && NumberAccount!=AccountNumber()) { Comment("Торговля на счёте: "+AccountNumber()+" ЗАПРЕЩЕНА!"); return; } else Comment(""); if (ShowComment) { string st="CurTime="+TimeToStr(TimeCurrent(), TIME_MINUTES) +" TimeTrade="+TimeTradeOpen +" Позиция="+GetNameOP(Sell) +" Lots="+DoubleToStr(Lots, 1) +" StopLoss="+DoubleToStr(StopLoss, 0)+" п." +" TakeProfit="+DoubleToStr(TakeProfit, 0)+" п." +IIFs(MarketWatch, " MarketWatch", "") ; Comment(st); } else Comment(""); } // ================= Условие ===================================== //Sell = false; if (DayOfWeek()==DayOfWeekIf && TimeCurrent()>=StrToTime(TimeToStr(TimeCurrent(), TIME_DATE)+" "+TimeTradeIf) && TimeCurrent()<StrToTime(TimeToStr(TimeCurrent(), TIME_DATE)+" "+TimeTradeIf)+Duration) { if (iClose("XAUUSD",PERIOD_H1,0)-iOpen("XAUUSD",PERIOD_H1,0)>=0) Sell = true; if (iOpen("XAUUSD",PERIOD_H1,0)-iClose("XAUUSD",PERIOD_H1,0)>0) Sell =false; } // Без условия все работает правильно. Sell тогда задаем во внешних параметрах. // ================= Открытие позиции ===================================== if (DayOfWeek()==DayOfWeekOpen && TimeCurrent()>=StrToTime(TimeToStr(TimeCurrent(), TIME_DATE)+" "+TimeTradeOpen) && TimeCurrent()<StrToTime(TimeToStr(TimeCurrent(), TIME_DATE)+" "+TimeTradeOpen)+Duration) { if (!ExistPositions("", Sell, MagicNumber)) { double sl, tp; if (Sell) { if (StopLoss>0) sl=Bid+StopLoss*Point; else sl=0; if (TakeProfit>0) tp=Bid-TakeProfit*Point; else tp=0; } else { if (StopLoss>0) sl=Ask-StopLoss*Point; else sl=0; if (TakeProfit>0) tp=Ask+TakeProfit*Point; else tp=0; } OpenPosition("", Sell, Lots, sl, tp, MagicNumber); } } //================= Закрытие всех ордеров в пятницу ===================================== if (DayOfWeek()==DayOfWeekClose && TimeCurrent()>=StrToTime(TimeToStr(TimeCurrent(), TIME_DATE)+" "+TimeTradeClose) && TimeCurrent()<StrToTime(TimeToStr(TimeCurrent(), TIME_DATE)+" "+TimeTradeClose)+Duration) { if (OrdersTotal()>0) { for (int i=OrdersTotal()-1; i>=0; i--) { if (OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) { if (OrderType()==OP_BUY) { RefreshRates(); OrderClose(OrderTicket(),OrderLots(),Bid,1000); return(0); } if (OrderType()==OP_SELL) { RefreshRates(); OrderClose(OrderTicket(),OrderLots(),Ask,1000); return(0); } } } } } } //+----------------------------------------------------------------------------+ //| | //| ПОЛЬЗОВАТЕЛЬСКИЕ ФУНКЦИИ | //| | //+----------------------------------------------------------------------------+ //| Автор : Ким Игорь В. aka KimIV, http://www.kimiv.ru | //+----------------------------------------------------------------------------+ //| Версия : 06.03.2008 | //| Описание : Возвращает флаг существования позиций | //+----------------------------------------------------------------------------+ //| Параметры: | //| sy - наименование инструмента ("" - любой символ, | //| NULL - текущий символ) | //| op - операция (-1 - любая позиция) | //| mn - MagicNumber (-1 - любой магик) | //| ot - время открытия ( 0 - любое время открытия) | //+----------------------------------------------------------------------------+ bool ExistPositions(string sy="", int op=-1, int mn=-1, datetime ot=0) { int i, k=OrdersTotal(); if (sy=="0") sy=Symbol(); for (i=0; i<k; i++) { if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) { if (OrderSymbol()==sy || sy=="") { if (OrderType()==OP_BUY || OrderType()==OP_SELL) { if (op<0 || OrderType()==op) { if (mn<0 || OrderMagicNumber()==mn) { if (ot<=OrderOpenTime()) return(True); } } } } } } return(False); } //+----------------------------------------------------------------------------+ //| Автор : Ким Игорь В. aka KimIV, http://www.kimiv.ru | //+----------------------------------------------------------------------------+ //| Версия : 01.09.2005 | //| Описание : Возвращает наименование торговой операции | //+----------------------------------------------------------------------------+ //| Параметры: | //| op - идентификатор торговой операции | //+----------------------------------------------------------------------------+ string GetNameOP(int op) { switch (op) { case OP_BUY : return("Buy"); case OP_SELL : return("Sell"); case OP_BUYLIMIT : return("Buy Limit"); case OP_SELLLIMIT: return("Sell Limit"); case OP_BUYSTOP : return("Buy Stop"); case OP_SELLSTOP : return("Sell Stop"); default : return("Unknown Operation"); } }