MQL4、MQL5に関する初心者からの質問、アルゴリズムやコードに関するヘルプ、ディスカッションなど。 - ページ 1801 1...179417951796179717981799180018011802180318041805180618071808...1953 新しいコメント Tretyakov Rostyslav 2021.12.08 12:07 #18001 законопослушный гражданин #:2回目の話題提供ですみません。// Параметры советника input string sParametersEA = ""; // Параметры советника input double Lot = 0.01; // Количество лотов input int StopLoss = 30; // Уровень убытка input int TakeProfit = 30; // Уровень прибыли 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 sParametersMA = ""; // Параметры индикатора input int PeriodMA = 14; // Период мувинга input int MovingShift = 1; // Сдвиг мувинга // Глобальные переменные string AC; datetime Start, newbar; double dMA; double MaxMartinLot; double MaxMartinLot2; //+-----------------------------------------------------------------------------------------------+ 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(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(dMA > Open[1] && dMA < Close[1]) //Open[1] и Close[1]- цены открытия и закрытия каждого бара текущего графика. return(true); return(false); } //+-----------------------------------------------------------------------------------------------+ //| Функция поиска сигнала на продажу | //+-----------------------------------------------------------------------------------------------+ bool bSignalSell() { if(dMA < Open[1] && dMA > Close[1]) return(true); return(false); } //+-----------------------------------------------------------------------------------------------+ //| Функция открытия ордера на покупку | //+-----------------------------------------------------------------------------------------------+ void vOrderOpenBuy() { if(newbar!=Time[0]) { // Тикет ордера int iOTi = 0; iOTi = OrderSend(Symbol(), OP_BUY, LOT(), Ask, Slippage, 0, 0, "", Magic, 0, clrNONE); // Проверим открылся ли ордер if(iOTi > 0) // Есди да, то выставим уровни убытка и прибыли vOrderModify(iOTi); else // Если нет, то получим ошибку vError(GetLastError()); newbar=Time[0]; } } //+-----------------------------------------------------------------------------------------------+ //| Функция открытия ордера на продажу | //+-----------------------------------------------------------------------------------------------+ void vOrderOpenSell() { if(newbar!=Time[0]) { // Тикет ордера 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()); newbar=Time[0]; } } //+-----------------------------------------------------------------------------------------------+ //| Функция модификации ордера | //+-----------------------------------------------------------------------------------------------+ 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); }Mihail Matkovskij(ミハイル・マトコフスキー) #: これは、信号を見逃すことになります законопослушный гражданин 2021.12.08 12:27 #18002 MakarFX #: これで信号が通る。 ありがとうございます、両方試してみます。 Ivan Butko 2021.12.08 12:28 #18003 アドバイスをお願いします。1.MT5でのマルチテスト どのように配置されているか:各ペアを順番に、または並行して、合計時間に従って(実際の多通貨取引の 模倣)。2.MT4のストラテジーテスターで、他の通貨ペアのインジケーターデータを使用することは可能でしょうか? aleksan2021 2021.12.08 12:37 #18004 実際のティックでEAをテストするたびに(タイムフレームとブローカーは同じです)、なぜmt5ターミナルは毎回ブローカーから同じデータをダウンロードするのか教えてください。mt5はこのデータを一度ダウンロードしてから、パソコンからダウンロードするのではないのですか? законопослушный гражданин 2021.12.08 13:17 #18005 законопослушный гражданин #:ありがとうございます、両方試してみます。 どちらのバージョンも使えますが、どちらが良いですか?) Valeriy Yastremskiy 2021.12.08 13:22 #18006 Ivan Butko 多通貨取引の 模倣)。 2.MT4のストラテジーテスターで、他の通貨ペアのインジケーターデータを使用することは可能でしょうか? 2.はい、しかし、ペアのデータは、引用符のアーカイブに事前にロードされ、あなたがロードした間隔からのみ利用可能であるべきです、それぞれのTFのためにそれらの日付は異なっています。1分足の場合 長くて5ヶ月。注文はできないが、バーからデータを取得することができるため、指標から取得することができる。また、ティックデータも存在しない。 Tretyakov Rostyslav 2021.12.08 13:23 #18007 законопослушный гражданин #:2台とも使える!どっちがいい?) ミハイルのバージョンでは、新しいローソクの最初のティックにのみシグナルをチェックし、もしシグナルが最初のティックよりも遅ければ、エキスパートアドバイザーはそれを見逃してしまいます。 законопослушный гражданин 2021.12.08 13:27 #18008 MakarFX #: ミハイルのバージョンでは、新しいローソクの最初のティックにのみシグナルをチェックし、もしシグナルが最初のティックよりも遅ければ、エキスパートアドバイザーはそれを見逃してしまいます。 では、マイケルのバージョンによれば、このテストでは、同じ期間の受注が少なくなるはずなのですね。 Tretyakov Rostyslav 2021.12.08 13:30 #18009 законопослушный гражданин #:では、マイケルのバージョンによれば、このテストでは、同じ期間の受注が少なくなるはずなのですね。 可能性がある。 Ivan Butko 2021.12.08 13:57 #18010 Valeriy Yastremskiy #:2.はい、しかし、これらのペアは、引用アーカイブに事前にロードする必要があり、各TF異なる日付のために、ダウンロードした間隔からのみ使用可能になります。1分小節の場合 5ヶ月、それ以上は通常なし。各注文について、注文はできないが、バーからのデータは取得でき、結果的に指標からも取得できる。私もティックデータは持っていません。 感謝 1...179417951796179717981799180018011802180318041805180618071808...1953 新しいコメント 取引の機会を逃しています。 無料取引アプリ 8千を超えるシグナルをコピー 金融ニュースで金融マーケットを探索 新規登録 ログイン スペースを含まないラテン文字 このメールにパスワードが送信されます エラーが発生しました Googleでログイン WebサイトポリシーおよびMQL5.COM利用規約に同意します。 新規登録 MQL5.com WebサイトへのログインにCookieの使用を許可します。 ログインするには、ブラウザで必要な設定を有効にしてください。 ログイン/パスワードをお忘れですか? Googleでログイン
2回目の話題提供ですみません。
これで信号が通る。
ありがとうございます、両方試してみます。
ありがとうございます、両方試してみます。
どちらのバージョンも使えますが、どちらが良いですか?)
2.はい、しかし、ペアのデータは、引用符のアーカイブに事前にロードされ、あなたがロードした間隔からのみ利用可能であるべきです、それぞれのTFのためにそれらの日付は異なっています。1分足の場合 長くて5ヶ月。注文はできないが、バーからデータを取得することができるため、指標から取得することができる。また、ティックデータも存在しない。
2台とも使える!どっちがいい?)
ミハイルのバージョンでは、新しいローソクの最初のティックにのみシグナルをチェックし、もしシグナルが最初のティックよりも遅ければ、エキスパートアドバイザーはそれを見逃してしまいます。
では、マイケルのバージョンによれば、このテストでは、同じ期間の受注が少なくなるはずなのですね。
では、マイケルのバージョンによれば、このテストでは、同じ期間の受注が少なくなるはずなのですね。
2.はい、しかし、これらのペアは、引用アーカイブに事前にロードする必要があり、各TF異なる日付のために、ダウンロードした間隔からのみ使用可能になります。1分小節の場合 5ヶ月、それ以上は通常なし。各注文について、注文はできないが、バーからのデータは取得でき、結果的に指標からも取得できる。私もティックデータは持っていません。
感謝