初心者の方からの質問 MQL5 MT5 MetaTrader 5 - ページ 421

 

バーチェンジの時だけ計算する - 私の方法です :)最適化のためのアイデアがあれば、ぜひお聞かせください。

//+------------------------------------------------------------------+
//|                                                       Target.mq4 |
//|                      Copyright © 2008, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2008, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property strict


double CC;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---

//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---

  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
   if (Close[1]-CC!=0)
   {
   CC=Close[1]; 
 
   double MAT=NormalizeDouble(iMA(Symbol(),0,100,0,0,0,0),Digits);
   double S=11*Point;
   double Target;
   int Buy=1;
   int Sell=1;
   if(Open[0]-MAT>S || MAT-Open[0]<S) //Условие убытка - надо искать новый TP
     {
      if(Buy==1) //Если условно ордеров на покупку больше, чем ордеров на продажу (проверять лучше по объему позиции)
        {
         double TargetMassiv[5];        //Создаем массив
         double TargetMassivOk[5];      //Создаем массив
         int N=0;                       //Переменная для изменения размера массива
         int X=0;                       //Переменная для получение информации о номере индекса массива, наиболее соответствующему усредненному значению массива
 
         int Max=0;
         int Min=0;
         int MaxBuy=0;
         int MinBuy=0;
         double sr_Target=0;

         ArrayFree  (TargetMassiv);         //Очищаем массив
         ArrayFree  (TargetMassivOk);       //Очищаем массив
         ArrayResize(TargetMassiv,5,0);     //Восстанавливаем размер массива
         ArrayResize(TargetMassivOk,5,0);   //Восстанавливаем размер массива

         TargetMassiv[0]=NormalizeDouble (iMA(Symbol(),0,100,0,0,0,100),Digits);
         TargetMassiv[1]=NormalizeDouble (iMA(Symbol(),0,100,0,1,0,0),Digits);
         TargetMassiv[2]=NormalizeDouble (iMA(Symbol(),0,55,0,2,0,0),Digits);
         TargetMassiv[3]=NormalizeDouble (iMA(Symbol(),0,88,0,3,0,0),Digits);
         TargetMassiv[4]=NormalizeDouble (iMA(Symbol(),0,12,0,0,0,0),Digits);

         for(int i=0;i<5;i++) //Записываем значение в новый массив по условию
           {
            if(TargetMassiv[i]>MAT && TargetMassiv[i]!=0)
              {
               TargetMassivOk[i]=TargetMassiv[i];
               N++;

              }

           }

         ArraySort(TargetMassivOk,WHOLE_ARRAY,0,MODE_DESCEND);    //Сортировка массива
         if(N!=0)

           {
            ArrayResize(TargetMassivOk,N,0);

            Max=ArrayMaximum(TargetMassiv,WHOLE_ARRAY,0);
            Min=ArrayMinimum(TargetMassiv,WHOLE_ARRAY,0);
            MaxBuy=ArrayMaximum(TargetMassivOk,WHOLE_ARRAY,0);
            MinBuy=ArrayMinimum(TargetMassivOk,WHOLE_ARRAY,0);
            sr_Target=NormalizeDouble(iMAOnArray(TargetMassivOk,0,N,0,0,0),Digits);

            if(N==0)
              {X=N;}

            else

              {
               for(int i=0;i<N-1;i++)
                 {
                  if(sr_Target<=TargetMassivOk[i] && sr_Target>TargetMassivOk[i+1]) X=i;  //Берем большее значение т.к. для ордеров на покупку
                 }
              }

            Target=TargetMassivOk[X];
           }

         else

           {
            Max=0;
            Min=0;
            MaxBuy=0;
            MinBuy=0;
            sr_Target=0;
            Target=-1;
           }

         Print("Покупка");
         Print("Значения последних 5 элементов массива");
         for(int i=0;i<5;i++) printf("TargetMassiv[%d] = %G",i,TargetMassiv[i]);
         for(int i=0;i<N;i++) printf("TargetMassivOk[%d] = %G",i,TargetMassivOk[i]);

         Print("MAT= ",MAT);
         Print("Max= ",TargetMassiv[Max],"Min=",TargetMassiv[Min],"MaxBuy=",TargetMassivOk[MaxBuy],"MinBuy=",TargetMassivOk[MinBuy]);
         Print("Среднее значение массива TargetMassivOk= ",sr_Target);
         Print("Среднее значение массива TargetMassivOk наиболее соответствует индексу= ",X);
         Print("Target= ",Target);
        }

      /////////////////////////////////////////////////////////////////////////////

      if(Sell==1) //Если условно ордеров на продажу больше, чем ордеров на продажу (проверять лучше по объему позиции)     
        {
         double TargetMassiv[5];        //Создаем массив
         double TargetMassivOk[5];      //Создаем массив
         int N=0;                       //Переменная для изменения размера массива
         int X=0;                       //Переменная для получение информации о номере индекса массива, наиболее соответствующему усредненному значению массива
 
         int Max=0;
         int Min=0;
         int MaxSell=0;
         int MinSell=0;
         double sr_Target=0;


         ArrayFree  (TargetMassiv);         //Очищаем массив
         ArrayFree  (TargetMassivOk);       //Очищаем массив
         ArrayResize(TargetMassiv,5,0);     //Восстанавливаем размер массива
         ArrayResize(TargetMassivOk,5,0);   //Восстанавливаем размер массива

         TargetMassiv[0]=NormalizeDouble (iMA(Symbol(),0,100,0,0,0,100),Digits);
         TargetMassiv[1]=NormalizeDouble (iMA(Symbol(),0,100,0,1,0,0),Digits);
         TargetMassiv[2]=NormalizeDouble (iMA(Symbol(),0,55,0,2,0,0),Digits);
         TargetMassiv[3]=NormalizeDouble (iMA(Symbol(),0,88,0,3,0,0),Digits);
         TargetMassiv[4]=NormalizeDouble (iMA(Symbol(),0,12,0,0,0,0),Digits);

       // for(int i=0;i<5;i++)
         for(int i=4; i>=0; i--)
           {
            if(TargetMassiv[i]<MAT && TargetMassiv[i]!=0) //Записываем значение в новый массив по условию
              {
               TargetMassivOk[i]=TargetMassiv[i];
               N++;
              }

           }
         Print("N=",N);
         for(int i=0;i<N;i++) printf("До обработки TargetMassivOk[%d] = %G",i,TargetMassivOk[i]);
         ArraySort(TargetMassivOk,WHOLE_ARRAY,0,MODE_DESCEND);
        // ArraySort(TargetMassivOk,N,0,MODE_ASCEND);                //Сортировка массива
         if(N!=0)
           {
            ArrayResize(TargetMassivOk,N,0);
      //      ArraySort(TargetMassivOk,WHOLE_ARRAY,0,MODE_DESCEND);          //Дополнительная сортировка
            Max=ArrayMaximum(TargetMassiv,WHOLE_ARRAY,0);
            Min=ArrayMinimum(TargetMassiv,WHOLE_ARRAY,0);
            MaxSell=ArrayMaximum(TargetMassivOk,WHOLE_ARRAY,0);
            MinSell=ArrayMinimum(TargetMassivOk,WHOLE_ARRAY,0);
            sr_Target=NormalizeDouble(iMAOnArray(TargetMassivOk,0,N,0,0,0),Digits);

            for(int i=0;i<N-1;i++)
              {
               if(sr_Target<=TargetMassivOk[i] && sr_Target>TargetMassivOk[i+1]) X=i;
               //              if (X=!0) X=X-1;
              }
            Target=TargetMassivOk[X];
           }


         else

           {
            Max=0;
            Min=0;
            MaxSell=0;
            MinSell=0;
            sr_Target=0;
            Target=-1;
           }

         Print("Продажа");
         Print("Значения последних 5 элементов массива");
         for(int i=0;i<5;i++) printf("TargetMassiv[%d] = %G",i,TargetMassiv[i]);
         for(int i=0;i<N;i++) printf("TargetMassivOk[%d] = %G",i,TargetMassivOk[i]);

         Print("MAT=",MAT);
         Print("Max=",TargetMassiv[Max],"Min=",TargetMassiv[Min],"MaxSell=",TargetMassivOk[MaxSell],"MaxSell=",TargetMassivOk[MinSell]);
         Print("Среднее значение массива TargetMassivOk= ",sr_Target);
         Print("Среднее значение массива TargetMassivOk наиболее соответствует индексу= ",X);
         Print("Target= ",Target);
        }

     }
  }
}
//+------------------------------------------------------------------+

Автоматический трейдинг и тестирование торговых стратегий
Автоматический трейдинг и тестирование торговых стратегий
  • www.mql5.com
MQL5: язык торговых стратегий для MetaTrader 5, позволяет писать собственные торговые роботы, технические индикаторы, скрипты и библиотеки функций
 
-Aleks-:
間違いです。列挙はそのまま機能し、もしインデックス値が配列のサイズを超えたら罵倒されるでしょうし、そうではありません。ゼロを含む値があり、Nはゼロでないこともあるのですチェックも発生することがわかり、その後、配列がデータを書き込まないことが判明。
推測ではなく、提案されたループの不正確さを指摘したのです。どこからどこまでが自分なのか、配列の大きさは 5で、ループを作る必要がある...。
 
Artyom Trishkin:
推測ではなく、提案されたループの不正確さを指摘したのです。配列の大きさが5で、どこからどこまでがループなのか、自分で考えてみてください...。
私のバリエーションもあなたのバリエーションも、5つの値がありますが、その違いを説明してください。
 
-Aleks-:
私のもあなたのも5つの値を持っていますが、何が違うのでしょうか。

配列の大きさは5つです。配列のインデックスを 0を含む4から0にすると、ループは配列のすべての値を通過することになります。5からインデックスを作ろうとすると、配列が範囲外になってしまいます。ゼロを含まない4からゼロまでのインデックスを作成した場合、ループは配列全体を通過しません - 配列のゼロセルは読み込まれません。

すなわち、これが正しいのです。

for(int i=4; i>=0; i--) {}のようになります。

または

for(int i=0; i<5; i++) {}の場合。

配列のインデックス(i)
4
3
2
1
0
アレイセル番号
5
4
3
2
1
 
Artyom Trishkin:

配列の大きさは5つです。配列のインデックスを 0を含む4から0にすると、ループは配列のすべての値を通過することになります。5からインデックスを作ろうとすると、配列が範囲外になってしまいます。ゼロを含まない4からゼロまでのインデックスを作成した場合、ループは配列全体を通過しません - 配列のゼロセルは読み込まれません。

すなわち、これが正しいのです。

for(int i=4; i>=0; i--) {}のようになります。

または

for(int i=0; i<5; i++) {}の場合。

配列のインデックス(i)
4
3
2
1
0
アレイセル番号
5
4
3
2
1
私がコードに書いたものを例に書いたわけですね。ここで何が違うのか理解できないのですが...。
 
Leanid Aladzyeu:

最後にブルートフォースアタックを行う(ブルートフォースアタックはリストが変更されるとまずデータを失う可能性があるため)


 

Leanid Aladzyeu:


リーニッド・アラジーユ

最後にリビルドを行う(リストが変更されると、リビルドの際にデータが失われる可能性があるため)。


驚きの連続です...。なぜ、バックミラーの使い方を覚えるのではなく、交通ルールをひとつ覚えて、見ずにそのまま角を曲がってしまうのか......?

なぜ一度、未決済注文のリストからいくつかの注文を閉じるときに、最大のインデックスから最小のインデックスに移動しなければならないことを読み、さらにどこでもこの方向に移動するように他の人に助言するのですか...。

 
Alexey Viktorov:

驚きの連続です...。バックミラーの使い方を覚えるのではなく、交通ルールのワンポイントだけ覚えて、見ずに角を曲がって直進してしまうのはなぜなんでしょう?

なぜ一度、未決済の注文のリストからいくつかの注文を閉じると、大きなインデックスから小さなインデックスに注文を変更しようとし、常にこの方向を使用するように他の人に助言すると読みましたか...?

検索可能な項目はお好みで構いませんが、最後の1枚から最初の1枚に閉じるとき、その逆であるべきだったのが気になりました。そして、回転させるためのカウンターだけでなく、ニュアンスもありました。
 
Alexey Viktorov:

驚きの連続です...。バックミラーの使い方を覚えるのではなく、交通ルールのワンポイントだけ覚えて、見ずに角を曲がって直進してしまうのはなぜなんでしょう?

なぜ一度、未決済の注文のリストからいくつかの注文を閉じる場合は、大きなインデックスから小さなインデックスに移動し、常にこの方向に移動するように他の人に助言しなければならないと読んだのですか...?

これは、ループ内で削除されるすべてのもの(注文、グラフィックオブジェクトなど)に当てはまります。なぜなら、削除によって「オブジェクト配列」の前のセルが後続の「オブジェクト」で埋め尽くされるからです。もちろん、一般的には、状況を考慮する必要があります。例えば、インジケータを書く ときに、最後の要素(rates_total-1)から描画を始めるのは、大げさに言えば、賢明ではありません。
 
Vladimir Zubov:
ダック 好きなようにやればいいんだよ、最後から一番目を閉じるために無理していたんだ、逆にやればよかったんだよ。そして、私はそうしました。ただ、回すのはカウンターだけでなく、ニュアンスもあります。
Tapochun:
削除すると「オブジェクト配列」の前のセルが後続の「オブジェクト」で埋め尽くされるので、ループ内で削除されるものすべて(オーダー、グラフオブジェクトなど)に対して当てはまります。もちろん、一般的には、状況を考慮する必要があります。例えば、指標を書く ときに、最後の要素(rates_total-1)から描画を始めるのは、大げさに言えばバカバカしいですよね。

正しいやり方を説明しようとしているのか?それとも私が何か勘違いしていたのでしょうか?

実は、人気のない道路を走っていて、周りに車やトラクターが一台もない場合は、曲がらないんです。