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

 
Artyom Trishkin:
先日、クロスプラットフォームのインジケーターテンプレートをここに掲載しました。チェックしてみてください。
IndicatorBuffers()

ブログを書いて、そこに同じ質問の答えを掲載する必要がある...。そんな忍耐力があればいいんですけどね~。

以下、https://www.mql5.com/ru/forum/160683/page670#comment_90 54670。

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

ブログで、同じ質問の答えをそこに掲載したほうがいいのでは...。そんな忍耐力があればいいんですけどね~。

そうすべきかもしれませんね。時間がないんです。質問内容は常に同じ±です。

 
補助変数を最後のバッファのオーダー番号に割り当てることで、表示設定を規定することなく、この問題を解決しています。これ以前は、不要なバッファは中途半端な位置にありました。
 

助けてください。

日足で決済されたポジションに未決済注文を 出したいのですが、どうすればいいですか?

この関数は、最後に決済したポジションの価格に注文を出します。

日中に決済したすべてのポジションの価格に保留注文を入れるには、どうすればよいですか?

oid PriceTimePos(string sy="",int op=-1,int mn=-1) 
  {
   datetime t;
   bool daa;
   int d,k_=OrdersTotal(),typ_;
   double   r=0;
   int      i,k=OrdersHistoryTotal();

   if(sy=="0") sy=Symbol();
   for(i=0; i<k; i++) 
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY)) 
        {
         if(OrderSymbol()==Symbol()) 
           {
            if(OrderType()==OP_BUY || OrderType()==OP_SELL) 
              {
               if(op<0 ||OrderType()==op) 
                 {
                  if(mn<0 || OrderMagicNumber()==mn) 
                    {
                     if(OrderCloseTime()>=TimeCurrent()-1440*60)
                       {
                        t=OrderCloseTime();
                        r=OrderOpenPrice();
                        sl=OrderStopLoss();
                        tp=OrderTakeProfit();
                        lot=OrderLots();
                        typ_=OrderType();
                        //Print("OpenPrice",r);
                       }
                    }
                 }
              }
           }
        }
     }
// ЕСТЬ ОРДЕР ПО ЦЕНЕ ЗАКРЫТОЙ ПОЗИЦИИ?
   daa=false;
   for(i=0; i<k; i++) 
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) 
        {
         if((OrderSymbol()==sy || sy=="") && (op<0 || OrderType()==op)) 
           {
            if(OrderType()>1 && OrderType()<6) 
              {
               d=MarketInfo(OrderSymbol(), MODE_DIGITS);
               r=NormalizeDouble(r, d);
               if(r==NormalizeDouble(OrderOpenPrice(),d)) {daa=true;}
              }
           }
        }
     }
   if(daa==false)//ЕСЛИ НЕТ ОРДЕРА ПО ЦЕНЕ, СТАВЛЮ
     {
      double opprord=0;
      for(i=0; i<k_; i++) 
        {
         if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) 
           {
            if((OrderSymbol()==sy || sy=="") && (op<0 || OrderType()==op)) 
              {
               if(OrderType()>1 && OrderType()<6) 
                 {
                  d=MarketInfo(OrderSymbol(),MODE_DIGITS);
                  opprord=OrderOpenPrice();
                  // r=NormalizeDouble(r, d);
                  if(r!=NormalizeDouble(opprord,d))
                    {
                     if(r>Ask)
                       {
                        if(typ_==OP_BUY)
                          {
                           Print("OP_BUYSTOP",r);
                           SetOrder(Symbol(),OP_BUYSTOP,lot,r,sl,tp,_MagicNumber,0,"bs");
                          }
                        if(typ_==OP_SELL)
                          {
                           Print("OP_SELLLIMIT",r);
                           SetOrder(Symbol(),OP_SELLLIMIT,lot,r,sl,tp,_MagicNumber,0,"sl");
                          }
                       }

                     //
                     if(Bid>r)
                       {
                        if(typ_==OP_BUY)
                          {
                           Print("OP_BUYLIMIT",r);
                           SetOrder(Symbol(),OP_BUYLIMIT,lot,r,sl,tp,_MagicNumber,0,"bl");
                          }
                        if(typ_==OP_SELL)
                          {
                           Print("OP_SELLSTOP",r);
                           SetOrder(Symbol(),OP_SELLSTOP,lot,r,sl,tp,_MagicNumber,0,"bs");
                          }
                       }
                    }
                 }
              }
           }
        }
     }
//return(r);
  }
 
PolarSeaman:

助けてください。

日足で決済されたポジションに未決済注文を 出したいのですが、どうすればいいですか?

この関数は、最後に決済したポジションの価格に注文を出します。

1日以内に決済したすべてのポジションの価格に未決済注文を入れるには、どうすればよいですか?

  1. ループ内のクローズしたポジションのリストを調べ、クローズ時間が必要な日の開始時間より長いもの(一昨日などの場合は翌日の開始時間より短いもの)を選択します。
  2. 見つかったすべてのポジションの終値(建値 - 正確に何を設定したいのかわからない)を単純な配列または構造体の配列に追加します。
  3. ループ内で作成された配列に目を通し、配列の価格に注文を出します(この価格に注文が存在するかどうかをチェックします。)
  4. その間に既に発注した注文の価格を配列から削除することもできますが、ちょっと面倒ですね...。
 

S. Kovalevの本でMQL4の勉強を始めました。コバレフ MT4の古いビルド用に書かれた本なので、コードに矛盾があるんだ。


このコードをどのように処理すればエラーが発生しないか、アドバイスをお願いします。

#property strict

int Count=0;
int init()      
{
   Alert ("Сработала ф-ия init() при запуске");   // Сообщение
   return;                                                                     // Выход из init()
   }   
//--------------------------------------------------------------------
int start()                                                                           // Спец. ф-ия start()
   {
   double Price = Bid;                                                      // Локальная перемен.
   Count++;                                                                      // Счётчик тиков
   Alert("Новый тик ",Count," Цена = ",Price);       // Сообщение
   return;                                                                        // Выход из start()
   }
int deinit()                                                                              // Спец. ф-ия deinit()
   {
   Alert ("Сработала ф-ия deinit() при выгрузке");         // Сообщение
   return;                                                                                 // Выход из deinit()
   }

失態

return' - この関数は 値を返す必要があります。

1.ということでよろしいでしょうか?

#property strict

int Count=0;
int init()      
{
   Alert ("Сработала ф-ия init() при запуске");   // Сообщение
   return(0);                                                                     // Выход из init()
   }   
//--------------------------------------------------------------------
int start()                                                                           // Спец. ф-ия start()
   {
   double Price = Bid;                                                      // Локальная перемен.
   Count++;                                                                      // Счётчик тиков
   Alert("Новый тик ",Count," Цена = ",Price);       // Сообщение
   return(0);                                                                        // Выход из start()
   }
int deinit()                                                                              // Спец. ф-ия deinit()
   {
   Alert ("Сработала ф-ия deinit() при выгрузке");         // Сообщение
   return(0);                                                                                 // Выход из deinit()
   }


2.質問ですが、チュートリアルで与えられた知識(情報の古さのことです)を使って新しいビルドのコードを書くことは、どの程度問題があるのでしょうか?



ファイル:
 
Sergey Branin:

S. Kovalevの本でMQL4の勉強を始めました。コバレフ MT4の古いビルド用に書かれた本なので、コードに矛盾があるんだ。


このコードをどのように処理すればエラーが発生しないか、アドバイスをお願いします。

失態

return' - この関数は 値を返す必要があります。

1.ということでよろしいでしょうか?


2.質問ですが、チュートリアルで与えられた知識で新しいビルドのコードを書くのはどの程度問題なのでしょうか(情報老化の要因ということです)。



OnInit()、OnDeinit()、OnTick()、その他リストから使用する。

Документация по MQL5: Обработка событий
Документация по MQL5: Обработка событий
  • www.mql5.com
В языке MQL5 предусмотрена обработка некоторых предопределенных событий. Функции для обработки этих событий должны быть определены в программе MQL5: имя функции, тип возвращаемого значения, состав параметров (если они есть) и их типы должны строго соответствовать описанию функции-обработчика события. Именно по типу возвращаемого значения и по...
 
Sergey Branin:

S. Kovalevの本でMQL4の勉強を始めました。コバレフ MT4の古いビルド用に書かれた本なので、コードに矛盾があるんだ。


このコードをどのように処理すればエラーが発生しないか、アドバイスをお願いします。

失態

return' - この関数は 値を返す必要があります。

1.ということでよろしいでしょうか?


2.質問ですが、チュートリアルの知識(情報の古さのことです)を使って新しいビルドのコードを書くことは、どの程度問題なのでしょうか?



  1. voidでない関数から値を返すのは正しいのですが、新しいビルドに切り替えた方が良いのです。
  2. 書く、コードの先頭に#property strictディレクティブを挿入することを忘れないでください - すべてのディレクティブが書かれている場所、エラーコードを読む - 彼らの説明はドキュメントにあり、すべてがうまくいくと複雑ではないでしょう。
 
Artyom Trishkin:
  1. クローズしたポジションのリストを循環させ、クローズ時間が開始時間より長いものを選択します。

ありがとうございます。最初のサイクルで必要な時間にクローズした ポジションのオープンプライスを見つけます。それらがすべてプリンターに表示され、発注する必要があるのです。

配列は私にとってちょっとしたジグソーパズルです。チェックするサイクルを挿入し、これらの価格を検索する最初のサイクルに始値に設定する方法をアドバイスしてください。

では、私が必要とする最も古いものの価格に基づき、次に見つかった価格に行くにはどうすればよいのでしょうか?
void PriceTimePos(string sy="",int op=-1,int mn=-1)
  {
   datetime t;
   bool daa;
   int d,k_=OrdersTotal(),typ_;
   double   r=0;
   int      i,k=OrdersHistoryTotal();

   if(sy=="0") sy=Symbol();
   for(i=0; i<k; i++)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY))
        {
         if(OrderSymbol()==Symbol())
           {
            if(OrderType()==OP_BUY || OrderType()==OP_SELL)
              {
               if(op<0 || OrderType()==op)
                 {
                  if(mn<0 || OrderMagicNumber()==mn)
                    {
                     if(OrderCloseTime()>=TimeCurrent()-1440*60)
                       {
                        t=OrderCloseTime();
                        r=OrderOpenPrice();
                        sl=OrderStopLoss();
                        tp=OrderTakeProfit();
                        lot=OrderLots();
                        typ_=OrderType();
                        //Print("OpenPrice",r);

                        // ЕСТЬ ОРДЕР ПО ЦЕНЕ ЗАКРЫТОЙ ПОЗИЦИИ?
                        daa=false;
                        for(i=0; i<k; i++)
                          {
                           if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
                             {
                              if((OrderSymbol()==sy || sy=="") && (op<0 || OrderType()==op))
                                {
                                 if(OrderType()>1 && OrderType()<6)
                                   {
                                    d=MarketInfo(OrderSymbol(), MODE_DIGITS);
                                    r=NormalizeDouble(r, d);
                                    if(r==NormalizeDouble(OrderOpenPrice(),d)) daa=true; //else continue;
                                   }
                                }
                             }
                          }
                        if(daa==false)//ЕСЛИ НЕТ ОРДЕРА ПО ЦЕНЕ, СТАВЛЮ
                          {

                           if(r>Ask)
                             {
                              if(typ_==OP_BUY)
                                {
                                 Print("OP_BUYSTOP",r);
                                 SetOrder(Symbol(),OP_BUYSTOP,lot,r,sl,tp,_MagicNumber,0,"bs");
                                }
                              if(typ_==OP_SELL)
                                {
                                 Print("OP_SELLLIMIT",r);
                                 SetOrder(Symbol(),OP_SELLLIMIT,lot,r,sl,tp,_MagicNumber,0,"sl");
                                }
                             }

                           //
                           if(Bid>r)
                             {
                              if(typ_==OP_BUY)
                                {
                                 Print("OP_BUYLIMIT",r);
                                 SetOrder(Symbol(),OP_BUYLIMIT,lot,r,sl,tp,_MagicNumber,0,"bl");
                                }
                              if(typ_==OP_SELL)
                                {
                                 Print("OP_SELLSTOP",r);
                                 SetOrder(Symbol(),OP_SELLSTOP,lot,r,sl,tp,_MagicNumber,0,"bs");
                                }
                             }

                          }
                        //return(r);
                       }
                    }
                 }
              }
           }
        }
     }
//
  }
 
PolarSeaman:

ありがとうございます。私は、最初のサイクルで適切なタイミングでクローズしたポジションの 始値を見つけます。全部プリンターで表示されるから、発注しないといけないんだ。

配列は私にとって迷路です。これらの価格を見つけるために、最初のループにチェックし始値に設定するサイクルをどのように入れるか教えてください。

やってしまったことを修正するよりも、配列とは何かを理解し、納得する方が早いです。

特に、配列は単純ではなく、非常にシンプルなものなので。

AKのマガジンには30発のカートリッジが入る......30サイズの配列です。そして、カートリッジはアレイに格納されたデータです。

確かにこれは良い例ではありません。0、1、2が揃わないと3が得られないのです。

さて、表計算ソフトを想像してみてください。

インデックス 0
インデックス1
インデックス2
インデックス3
インデックス 4
インデックス5インデックス6インデックス 7
インデックス8
インデックス 9
値1
インデックス値2
バリュー3
バリュー4
バリュー5
バリュー6
バリュー7
バリュー8
バリュー9
バリュー10

ここにサイズ10の単純な1次元配列があります。

インデックス0のセルに値1、インデックス1のセルに値2、インデックス2のセルに値3、...と格納される。
...
インデックスセル7に値8、インデックスセル8に値9、インデックスセル9に値10が格納されています。

というくらいにシンプルです。値3を得るには、配列のセル2を参照する必要があります:Value3=Array[2]。