MQL4、MQL5に関する初心者からの質問、アルゴリズムやコードに関するヘルプ、ディスカッションなど。 - ページ 1864

 
Бахром Балтабаев 私の携帯電話に通知を 送るスクリプトまたはインジケータはどこにあるか教えてください。

先日、アラート 書きました。しかし、SendNotificationを追加することで改善することができます。

// использовать алерт
input bool alert = true;
// использовать push-уведомления
input bool notification = true;
// уровень срабатывания
input double trigLv = 0.0;
// отклонение от trigLv в пунктах
input int deviation = 30; 


// функция взята из https://www.mql5.com/ru/docs/basis/types/double
bool EqualDoubles(double d1,double d2,double epsilon)
  {
   if(epsilon<0) 
      epsilon=-epsilon;
//---
   if(d1-d2>epsilon) 
      return false;
   if(d1-d2<-epsilon) 
      return false;
//---
   return true;
  }

//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit() {
  return(INIT_SUCCEEDED);
}

int OnCalculate(const int rates_total,
                 const int prev_calculated,
                 const datetime &time[],
                 const double &open[],
                 const double &high[],
                 const double &low[],
                 const double &close[],
                 const long &tick_volume[],
                 const long &volume[],
                 const int &spread[]
) {
  static bool triggered = false;
  static datetime time_ = 0;
  if (!alert && !notification)
    return rates_total;
  if (EqualDoubles(trigLv, close[rates_total - 1], deviation * SymbolInfoDouble(NULL, SYMBOL_POINT))) { // сравнение цены Close с trigLv
    if (time_ != time[rates_total - 1])
      time_ = time[rates_total - 1];
    else
      return rates_total;
    if (!triggered) {
      if (alert)
        Alert("Level ", NormalizeDouble(trigLv, (int)SymbolInfoInteger(NULL, SYMBOL_DIGITS)), " triggered!");
      if (notification)
        SendNotification("Level " + (string)NormalizeDouble(trigLv, (int)SymbolInfoInteger(NULL, SYMBOL_DIGITS)) + " triggered!");
    }
    triggered = true;
  }
  else
    triggered = false;
  
  return rates_total;
}

ハイライトした行をソースコードに追加し、Indicatorsフォルダにドロップしてコンパイルしてください。このインジケータは何度でもチャートに追加することができ、異なるレベルを超えたときにシグナルを受け取ることができます。コードはオンラインで最終決定されました。結果は未検証です。

Любые вопросы новичков по MQL4 и MQL5, помощь и обсуждение по алгоритмам и кодам
Любые вопросы новичков по MQL4 и MQL5, помощь и обсуждение по алгоритмам и кодам
  • www.mql5.com
В этой ветке я хочу начать свою помощь тем, кто действительно хочет разобраться и научиться программированию на новом MQL4 и желает легко перейти н...
 

トレーディング、自動売買システム、ストラテジーテストに関するフォーラム

MQL4、MQL5に関する初心者からの質問、アルゴリズムやコードに関するヘルプ、ディスカッションなど。

GlaVredFX, 2022.01.17 18:59

私は注文を 閉じるコードを探していて、もし何も表示されなければ、私は新しい注文を開くでしょう。

しかし、なぜか1つしか注文 を閉じず、次のシグナルの前に止まってしまいます。

2022.01.17 16:22:08.389 2022.01.04 08:00:00 e: Signal 1.1322 < clos 1.1304 ExistPosSell 0
2022.01.17 16:22:08.389 2022.01.04 08:00:00 e: Signal 1.1322 > clos 1.1304 ExistPosBuy 1
2022.01.17 16:22:08.366 2022.01.04 08:00:00 e: Signal 1.1325 < clos 1.1306 ExistPosSell 0
2022.01.17 16:22:08.366 2022.01.04 04:00:00 e: Signal 1.1325 > clos 1.1306 ExistPosBuy 1
2022.01.17 16:22:08.327 2022.01.04 2022.01.04 00:00:00 e: Signal 1.1325 > clos 1.1306 *1: Signal 1.1325 >clos 1.1306 ExistPosBuy 1 2022.01.17 16:22:08.326 2022. 02:00:001326 < clos 1.1296 ExistPosSell 0
2022.01.17 16:22:08.327 2022.01.04 00:00:00 e: Signal 1.1326 > clos 1.1296 ExistPosBuy 1
2022.01.17 16:22:08.298 2022.01.03 20:00:00 e: Signal 1.1328 < clos 1.1283 ExistPosSell 0
2022.01.17 16:22:08.298 2022.01.03 20:00:00 e: close #1 buy 0.01 EURUSD at 1.13598 at price 1.12831

2022.01.17 16:22:08.298 2022.01.03 20:00:00 e: Signal 1.1328 > close 1. 1383.1283 ExistPosBuy 1
2022.01.17 16:22:08.190 2022.01.03 16:00:00 e: open #4 buy 0.01 EURUSD at 1.13512 ok
2022.01.17 16:22:08.190 2022.01.17 17:22:08.190 2022.01.03 16:00:00 e: Signal 1.134 < close 1.135 ExistPosSell 0
2022.01.17 16:22:08.190 2022.01.03 16:00:00 e: Signal 1.134 > close 1.135 ExistPosBuy 1

if(isNewBar()==true) {  
if(Signal > clos ) {  //--------------------- МА выше цены закрытия предыдущего бара.
     if(ExistPositions( NULL, OP_BUY, Magic) == true) //---------------- Если есть позиция BUY то
ClosePosWithMaxProfitInCurrency(); //--------  закрытие одной позиции с максимальным профитом в валюте депозита.
         if(ExistPositions( NULL, OP_BUY, Magic) == False) //----------- если позиции BUY отсутствуют то
   ticket=OpenPosition(NULL,OP_SELL, NDLot(Lot),0,0, Magic, Com);} //------------ открываем позицию SELL

if(Signal < clos ) { //--------------------- МА ниже цены закрытия предыдущего бара.
    if(ExistPositions( NULL, OP_SELL, Magic) == true) //---------------- Если есть позиция SELL то
 ClosePosWithMaxProfitInCurrency(); //---------------------закрытие одной позиции с максимальным профитом в валюте депозита.
        if(ExistPositions( NULL, OP_SELL, Magic) == False)  //----------- если позиции SELL отсутствуют то
  ticket=OpenPosition(NULL,OP_BUY, NDLot(Lot),0,0, Magic, Com);} //------------ открываем позицию BUY

} return; 
質問とコードにもう少し注意を 払えば、何が問題なのか自分で分かると思います。
 
Mihail Matkovskij #:

あなたの質問とあなたのコードにもう少し注意を 払えば、あなた自身のために見ることができます。

質問は、最も収益性の高い1つの注文を1つのバーで決済し、その後新しいバーを待って、再び収益性の高い1つの注文を決済することです。一度に全部を閉じるべきではない。

これは、最初のバーでクローズするが、次のバーでは何も起こらないことを意味します。

 
GlaVredFX #:

そこでの問題は、最も収益性の高い1つの注文を1つのバーで決済し、その後新しいバーを待って、再び収益性の高い1つの注文を決済することです。一度に全部は閉じない方がよいでしょう。

それから、質問を正しく定式化することです。信号は1つだけです。新しいバーのオープニングで1回だけシグナルを取得します。シグナルが1つしかない場合、いくつの注文がクローズされるのでしょうか?そして、新しいバーでシグナルが表示された場合のみ。また、シグナルがない場合は、次のバーで注文を終了します。もう一度、信号があれば。

 
Mihail Matkovskij #:

そして、質問を正しく組み立てることです。信号が1つしかない。しかも、新しいバーの開店時にである。また、シグナルが1つしかない場合、いくつのオーダーがクローズされるのでしょうか?そして、新しいバーでシグナルが表示された場合のみ。また、シグナルがない場合は、次のバーで注文を終了します。そしてまた、信号があれば。

このような場合、通常はフローチャートが役に立ちます。あるいは、紙やテキストファイルに一点一点、アルゴリズムを詳細に記述する必要があります。そして初めて、コードの書き方を理解することができるのです。

 

すべての注文の中で、最初に開いた1つの注文を決済する機能が必要です。

 
GlaVredFX #:

そこでお気づきのように、アルゴリズムがコードに 書かれているのです。

1)新しいバーが表示される

2) MAが前バーの終値より高ければステップ3へ、MAが終値より低ければステップ4へ。

3)買いポジションを持っている場合通貨ペアで最大限の利益を得て1つのポジションを決済 します。

3.1) 買いの 注文がない場合は、売りのポジションを建 てる。

4) BUYポジションを持っている場合、通貨ペアで最大限の利益を得て1つのポジションを決済します。

4.1)売りの 注文がなければ買いのポジションを建てます。


さて、もう一度質問ですが、上記のアルゴリズムのこのコードのどこが問題なのでしょうか?

このコードにはコマンド一式が 含まれています。端末は、あなたが何を必要としているのかを知らない。それは、コードに書かれていることだけを知っているのだ

...

if(isNewBar()) {  
  if(Signal > clos ) {  //--------------------- МА выше цены закрытия предыдущего бара.
    if(ExistPositions( NULL, OP_BUY, Magic)) //---------------- Если есть позиция BUY то
      ClosePosWithMaxProfitInCurrency(); //--------  закрытие одной позиции с максимальным профитом в валюте депозита.
    if(!ExistPositions( NULL, OP_BUY, Magic)) //----------- если позиции BUY отсутствуют то
      sellSignal = true;
  } 

 // и аналогично для п.4.

} 
return; 

...

void OnTimer() {
  if (sellSignal) {
    ticket=OpenPosition(NULL,OP_SELL, NDLot(Lot),0,0, Magic, Com); //------------ открываем позицию SELL
    sellSignal = false;
  }
  // и аналогично для buy
}
変数 buySignal とsellSignalグローバルに書き込み ます。
 
Mihail Matkovskij #:

コマンドの セットがコードに書かれています。端末は、あなたが何を必要としているのかを知らない。それは、コードに書かれていることだけを知っているのだ

問題は、注文を利益ではなく時間で閉じることなので、このメッセージは削除しました。

なぜなら、私たちは常に、そして常にあるべきところに利益があるわけではないからです。

したがって、「すべての利用可能なポジションの一番最初に開かれた1つのポジションを閉じる」 機能が必要です。

 
GlaVredFX #:

問題は、利益よりも時間によって注文を閉じることなので、このメッセージは削除しました。

なぜなら、利益はいつもそこにあるわけではなく、あるべきところにあるわけでもないからです。

したがって、「すべての利用可能なポジションの一番最初に開かれた1つのポジションを閉じる」 機能が必要です。

前の記事でタイマーのポジションオープンの例を追加しました。ポジションのオープンが保証されるように。そこに自分の好きな機能を代入することができます。

 
Mihail Matkovskij #:

前の記事でタイマーの位置が開く例を追加しました。ポジションのオープンが保証されるように。そこに自分の好きな機能を代入することができます。

でも、こうはいかない。の結果を監視する必要があります。

ClosePosWithMaxProfitInCurrency

またはOnTradeTransactionにあなたの新しい関数があります。そして、ポジションがなければ、エントリーします。または、例に 挙げたようにbuySignalやsellSignalに シグナルを書き、OnTimerで処理 する。