MQL4、MQL5に関する初心者からの質問、アルゴリズムやコードに関するヘルプ、ディスカッションなど。 - ページ 1781 1...177417751776177717781779178017811782178317841785178617871788...1953 新しいコメント законопослушный гражданин 2021.12.03 10:34 #17801 MakarFX #:もう一度、違いを強調します。1 変形2バリアント。 はい、ありがとうございます。了解しました。 законопослушный гражданин 2021.12.03 10:35 #17802 Mihail Matkovskij #:OrdersTotal、OrdersHistoryTotalを やみくもにコピーするのではなく、自分が何をコーディングしているのか理解するようにしましょう。オーダーセレクト やってみます。 законопослушный гражданин 2021.12.03 12:38 #17803 //+-----------------------------------------------------------------------------------------------+ //| Simple Moving Average.mq4 | //| | //+-----------------------------------------------------------------------------------------------+ #property copyright "Copyright 2021" #property link "https://www.mql5.com/ru/users/" #property version "1.00" #property strict // Параметры советника input string sParametersEA = ""; // Параметры советника input double Lot = 0.01; // Количество лотов input double LotControl = 0.01; // Контрольная лотность input int StopLoss = 30; // Уровень убытка input int TakeProfit = 30; // Уровень прибыли input int Deviation = 20; // Отступ цены входа input int Slippage = 3; // Проскальзование (в пунктах) input int Magic = 1; // Индентификатор советника input double K_Martin1 = 2.0; // Множитель мартин 1 input double K_Martin2 = 2.0; // Множитель мартин 2 input double K_Martin3 = 2.0; // Множитель мартин 3 input int OrdersClose = 5; // Ограничение лотности мартин1 input int OrdersClose2 = 5; // Ограничение лотности мартин2 input int DigitsLot = 2; // Точность лотности // Параметры индикатора input string ParametersMA = ""; // Параметры индикатора input int PeriodMA = 14; // Период мувинга input int MovingShift = 1; // Сдвиг мувинга // Глобальные переменные string AC; datetime Start; double dMA; double MaxMartinLot; double MaxMartinLot2; double openPrice; // цена открытия позиции //+-----------------------------------------------------------------------------------------------+ int OnInit() { Start = TimeCurrent(); MaxMartinLot = Lot*MathPow(1.4,OrdersClose); MaxMartinLot2 = Lot*MathPow(K_Martin2,OrdersClose2); AC = StringConcatenate(" ", AccountCurrency()); return(INIT_SUCCEEDED); } //+-----------------------------------------------------------------------------------------------+ void OnDeinit(const int reason) { } //+-----------------------------------------------------------------------------------------------+ void OnTick() { // Получим значение индикатора dMA = iMA(Symbol(), 0,PeriodMA, MovingShift, MODE_SMA, PRICE_CLOSE, 0); // MODE_SMA - простое усреднение , значение 0. PRICE_CLOSE- цена закрытия, значение 0. if(GetLotSize()<LotControl) openPrice = dMA; else openPrice = dMA + Deviation * _Point; // Если нет открытых ордеров, то входим в условие if(CountOrders()==0) { // Если появился сигнал на покупку, то откроем ордер на покупку if(bSignalBuy() == true) vOrderOpenBuy(); // Если появился сигнал на продажу, то откроем ордер на продажу if(bSignalSell() == true) vOrderOpenSell(); } } //+-----------------------------------------------------------------------------------------------+ //| Функция проверки открытых оредров | //+-----------------------------------------------------------------------------------------------+ int CountOrders() { int cnt=0; int i=OrdersTotal()-1; for(int pos=i;pos>=0;pos--) { if(OrderSelect(pos, SELECT_BY_POS, MODE_TRADES)) { if(OrderSymbol()==_Symbol) { if(OrderMagicNumber()==Magic) cnt++; } } } return(cnt); } //+-----------------------------------------------------------------------------------------------+ //| Функция поиска сигнала на покупку | //+-----------------------------------------------------------------------------------------------+ bool bSignalBuy() { if (openPrice > Open[1] && openPrice < Close[1]) //Open[1] и Close[1]- цены открытия и закрытия каждого бара текущего графика. return(true); return(false); } //+-----------------------------------------------------------------------------------------------+ //| Функция поиска сигнала на продажу | //+-----------------------------------------------------------------------------------------------+ bool bSignalSell() { if(openPrice< Open[1] && openPrice > Close[1]) return(true); return(false); } //+-----------------------------------------------------------------------------------------------+ //| Функция открытия ордера на покупку | //+-----------------------------------------------------------------------------------------------+ void vOrderOpenBuy() { // Тикет ордера int iOTi = 0; iOTi = OrderSend(Symbol(), OP_BUY, LOT(), Ask, Slippage, 0, 0, "", Magic, 0, clrNONE); // Проверим открылся ли ордер if(iOTi > 0) // Есди да, то выставим уровни убытка и прибыли vOrderModify(iOTi); else // Если нет, то получим ошибку vError(GetLastError()); } //+-----------------------------------------------------------------------------------------------+ //| Функция открытия ордера на продажу | //+-----------------------------------------------------------------------------------------------+ void vOrderOpenSell() { // Тикет ордера int iOTi = 0; //Print(bCheckOrders()); iOTi = OrderSend(Symbol(), OP_SELL, LOT(), Bid, Slippage, 0, 0, "", Magic, 0, clrNONE); // Проверим открылся ли ордер if(iOTi > 0) // Есди да, то выставим уровни убытка и прибыли vOrderModify(iOTi); else // Если нет, то получим ошибку vError(GetLastError()); } //+-----------------------------------------------------------------------------------------------+ //| Функция модификации ордера | //+-----------------------------------------------------------------------------------------------+ void vOrderModify(int iOTi) { int iOTy = -1; // Тип ордера double dOOP = 0; // Цена открытия ордера double dOSL = 0; // Стоп Лосс int iMag = 0; // Идентификатор советника double dSL = 0; // Уровень убытка double dTP = 0; // Уровень прибыли // Выберем по тикету открытый ордер, получим некоторые значения if(OrderSelect(iOTi, SELECT_BY_TICKET, MODE_TRADES)) { iOTy = OrderType(); dOOP = OrderOpenPrice(); dOSL = OrderStopLoss(); iMag = OrderMagicNumber(); } // Если ордер открыл данный советник, то входим в условие if(OrderSymbol() == Symbol() && OrderMagicNumber() == iMag) { // Если Стоп Лосс текущего ордера равен нулю, то модифицируем ордер if(dOSL == 0) { if(iOTy == OP_BUY) { dSL = NormalizeDouble(dOOP - StopLoss * Point, Digits); dTP = NormalizeDouble(dOOP + TakeProfit * Point, Digits); bool bOM = OrderModify(iOTi, dOOP, dSL, dTP, 0, clrNONE); } if(iOTy == OP_SELL) { dSL = NormalizeDouble(dOOP + StopLoss * Point, Digits); dTP = NormalizeDouble(dOOP - TakeProfit * Point, Digits); bool bOM = OrderModify(iOTi, dOOP, dSL, dTP, 0, clrNONE); } } } } //+-----------------------------------------------------------------------------------------------+ //| Функция обработки ошибок | //+-----------------------------------------------------------------------------------------------+ void vError(int iErr) { switch(iErr) { case 129: // Неправильная цена case 135: // Цена изменилась case 136: // Нет цен case 138: // Новые цены Sleep(1000); RefreshRates(); break; case 137: // Брокер занят case 146: // Подсистема торговли занята Sleep(3000); RefreshRates(); break; } } //+-----------------------------------------------------------------------------------------------+ double LOT() { int n=0; int m=0; int v=0; double OL=Lot; for (int j = OrdersHistoryTotal()-1; j >= 0; j--) { if (OrderSelect(j, SELECT_BY_POS,MODE_HISTORY)) { if (OrderSymbol() == Symbol() && OrderMagicNumber() == Magic) { if (OrderProfit()>0) { if (n==0) OL=NormalizeDouble(OrderLots()+K_Martin1,DigitsLot); n++; if ((OL>=MaxMartinLot)&& (m==0)) OL=NormalizeDouble(OrderLots()*K_Martin2,DigitsLot); m++; if ((OL>=MaxMartinLot2) && (v==0)) OL=NormalizeDouble(OrderLots()*K_Martin3,DigitsLot); v++; } else { if (n==0) {return(Lot);} else {return(OL);} } } } } return(OL); } //+------------------------------------------------------------------+ //| Функция считает по символу и магику | //| размер лота с начала цикла | //+------------------------------------------------------------------+ double GetLotSize() { double Ls=0; datetime t=0; int i=OrdersHistoryTotal(); for(int pos=0; pos<i; pos++) { if(OrderSelect(pos, SELECT_BY_POS, MODE_HISTORY)) { if(OrderSymbol()==_Symbol && OrderMagicNumber()==Magic) { if(OrderType()==OP_BUY || OrderType()==OP_SELL) { if(t<OrderCloseTime()) {t=OrderCloseTime(); Ls=OrderLots();} } } } } return Ls; } void OnTick()の部分を書き直しました。 あるロットに達したとき(LotControl)、指定されたポイント数(Deviationパラメータ)がシグナルに加算されるようにする。 その結果、問題を抱えたまま動作してしまうのです。 まずヒストリーのテストですが、500トレード(1分間に1〜2トレード)でほぼ停止するようになりました。 (通常の速度から始まり、だんだん遅くなる)。 次に、Deviationは(LotControl)の後ではなく、指定したロットの1~2ステップ後に接続されます。 Tretyakov Rostyslav 2021.12.03 13:17 #17804 законопослушный гражданин #:void OnTick()の部分を書き直しました。あるロットに達すると(LotControl)、指定されたポイント数がシグナルに追加されるように(Deviationパラメータ)。その結果、問題を抱えたまま動作してしまうのです。まずヒストリーのテストですが、500トレード(1分間に1〜2トレード)でほぼ停止するようになりました。(通常の速度から始まり、だんだん遅くなる)。次に、Deviationは(LotControl)の後ではなく、指定したロットの1~2ステップ後に接続されます。 この方法で試してみてください。 void OnTick() から削除しました。 // Получим значение индикатора dMA = iMA(Symbol(), 0,PeriodMA, MovingShift, MODE_SMA, PRICE_CLOSE, 0); // MODE_SMA - простое усреднение , значение 0. PRICE_CLOSE- цена закрытия, значение 0. if(GetLotSize()<LotControl) openPrice = dMA; else openPrice = dMA + Deviation * _Point; とここに書いてあります。 //+-----------------------------------------------------------------------------------------------+ //| Функция поиска сигнала на покупку | //+-----------------------------------------------------------------------------------------------+ bool bSignalBuy() { dMA = iMA(Symbol(), 0,PeriodMA, MovingShift, MODE_SMA, PRICE_CLOSE, 0); openPrice = dMA + Deviation * _Point; if(GetLotSize()<LotControl) openPrice = dMA; if(openPrice > Open[1] && openPrice < Close[1]) //Open[1] и Close[1]- цены открытия и закрытия каждого бара текущего графика. return(true); return(false); } //+-----------------------------------------------------------------------------------------------+ //| Функция поиска сигнала на продажу | //+-----------------------------------------------------------------------------------------------+ bool bSignalSell() { dMA = iMA(Symbol(), 0,PeriodMA, MovingShift, MODE_SMA, PRICE_CLOSE, 0); openPrice = dMA + Deviation * _Point; if(GetLotSize()<LotControl) openPrice = dMA; if(openPrice< Open[1] && openPrice > Close[1]) return(true); return(false); } законопослушный гражданин 2021.12.03 13:57 #17805 MakarFX #:この方法で試してみてください。void OnTick() から削除しました。 とここに書いてあります。 を選択しても、結果は同じです。 シグナルの問題ではなく、このEAと似たようなEAを他に2つ持っているが、ブレーキがかからない законопослушный гражданин 2021.12.03 14:00 #17806 MakarFX #:この方法で試してみてください。void OnTick() から削除しました。 をクリックして、ここに置いてください。 最初は不安だったんですよ。 double GetLotSize() { double Ls=0; datetime t=0; int i=OrdersHistoryTotal(); for(int pos=0; pos<i; pos++) { if(OrderSelect(pos, SELECT_BY_POS, MODE_HISTORY)) { if(OrderSymbol()==_Symbol && OrderMagicNumber()==Magic) { if(OrderType()==OP_BUY || OrderType()==OP_SELL) { if(t<OrderCloseTime()) {t=OrderCloseTime(); Ls=OrderLots();} } } } } return Ls; } しかし、他の2つのフクロウはテスターで問題なく動作しています。 Tretyakov Rostyslav 2021.12.03 14:16 #17807 законопослушный гражданин #:最初はこれかと思いました。 何も問題はないんだけどね。 後であなたのコードを見て、テスターでどのタイムフレームを使っているのか、どのペアなのかを書いてください。自分も遅くなってないか確認してみます。 законопослушный гражданин 2021.12.03 14:34 #17808 MakarFX #:何も問題はないんです。後であなたのコードを見て、テスターでどのタイムフレームを使用しているか、どのペアを使用しているかを投稿します。スピードが落ちていないか確認する。 ええ、どんなペアでも。 AUD/USDはM15を使用しています。 御社のインジケータ(添付)でも同じ問題が発生しました。 消去法でわかったんですが、これのせいで遅くなるんです。 double GetProfitFromStart() { double lp=0,cp=0; for(int i=0; i<OrdersHistoryTotal(); i++) { if(OrderSelect(i, SELECT_BY_POS, MODE_HISTORY)) { if(OrderSymbol()==_Symbol && OrderMagicNumber()==Magic) { if(OrderType()==OP_BUY || OrderType()==OP_SELL) { if(Start<OrderCloseTime()) {lp+=OrderProfit()+OrderCommission()+OrderSwap();} } } } } for(int pos=OrdersTotal()-1;pos>=0;pos--) { if(OrderSelect(pos, SELECT_BY_POS, MODE_TRADES)) { if(OrderSymbol()==_Symbol && OrderMagicNumber()==Magic) { if(OrderType()==OP_BUY || OrderType()==OP_SELL) {cp=OrderProfit()+OrderCommission()+OrderSwap();} } } } return(lp+cp); } ファイル: Citizen.v2.1_-_powhn.mq4 35 kb Tretyakov Rostyslav 2021.12.03 16:24 #17809 законопослушный гражданин #:ええ、どんなペアでも。AUD/USDはM15を使用しています。御社のインジケータ(添付)でも同じ問題が発生しました。消去法で、このことが処理を遅くしているのだとわかったのです。 オーダーオーバーライドを変更する for (int i= OrdersHistoryTotal()-1; i>= 0; i--) Artyom Trishkin 2021.12.03 16:58 #17810 MakarFX #:オーダーのオーバーシュートを変更する みんな、できるだけ、最後にチェックしたときのループのインデックス値を覚えていないと、利用可能なすべての履歴にループが走ることになるんだ。そして、それが多ければ多いほど、そのサイクルは長くなります。 1...177417751776177717781779178017811782178317841785178617871788...1953 新しいコメント 取引の機会を逃しています。 無料取引アプリ 8千を超えるシグナルをコピー 金融ニュースで金融マーケットを探索 新規登録 ログイン スペースを含まないラテン文字 このメールにパスワードが送信されます エラーが発生しました Googleでログイン WebサイトポリシーおよびMQL5.COM利用規約に同意します。 新規登録 MQL5.com WebサイトへのログインにCookieの使用を許可します。 ログインするには、ブラウザで必要な設定を有効にしてください。 ログイン/パスワードをお忘れですか? Googleでログイン
もう一度、違いを強調します。
1 変形
2バリアント。
はい、ありがとうございます。了解しました。
OrdersTotal、OrdersHistoryTotalを やみくもにコピーするのではなく、自分が何をコーディングしているのか理解するようにしましょう。
オーダーセレクト
やってみます。
void OnTick()の部分を書き直しました。
あるロットに達したとき(LotControl)、指定されたポイント数(Deviationパラメータ)がシグナルに加算されるようにする。
その結果、問題を抱えたまま動作してしまうのです。
まずヒストリーのテストですが、500トレード(1分間に1〜2トレード)でほぼ停止するようになりました。
(通常の速度から始まり、だんだん遅くなる)。
次に、Deviationは(LotControl)の後ではなく、指定したロットの1~2ステップ後に接続されます。
void OnTick()の部分を書き直しました。
あるロットに達すると(LotControl)、指定されたポイント数がシグナルに追加されるように(Deviationパラメータ)。
その結果、問題を抱えたまま動作してしまうのです。
まずヒストリーのテストですが、500トレード(1分間に1〜2トレード)でほぼ停止するようになりました。
(通常の速度から始まり、だんだん遅くなる)。
次に、Deviationは(LotControl)の後ではなく、指定したロットの1~2ステップ後に接続されます。
この方法で試してみてください。
void OnTick() から削除しました。
とここに書いてあります。
この方法で試してみてください。
void OnTick() から削除しました。
とここに書いてあります。
を選択しても、結果は同じです。
シグナルの問題ではなく、このEAと似たようなEAを他に2つ持っているが、ブレーキがかからない
この方法で試してみてください。
void OnTick() から削除しました。
をクリックして、ここに置いてください。
最初は不安だったんですよ。
しかし、他の2つのフクロウはテスターで問題なく動作しています。
最初はこれかと思いました。
何も問題はないんだけどね。
後であなたのコードを見て、テスターでどのタイムフレームを使っているのか、どのペアなのかを書いてください。自分も遅くなってないか確認してみます。
何も問題はないんです。
後であなたのコードを見て、テスターでどのタイムフレームを使用しているか、どのペアを使用しているかを投稿します。スピードが落ちていないか確認する。
ええ、どんなペアでも。
AUD/USDはM15を使用しています。
御社のインジケータ(添付)でも同じ問題が発生しました。
消去法でわかったんですが、これのせいで遅くなるんです。
ええ、どんなペアでも。
AUD/USDはM15を使用しています。
御社のインジケータ(添付)でも同じ問題が発生しました。
消去法で、このことが処理を遅くしているのだとわかったのです。
オーダーオーバーライドを変更する
オーダーのオーバーシュートを変更する
みんな、できるだけ、最後にチェックしたときのループのインデックス値を覚えていないと、利用可能なすべての履歴にループが走ることになるんだ。そして、それが多ければ多いほど、そのサイクルは長くなります。