チェック - 何がいけなかったのか?

 

コードの書き方

int GetN()
{
   int n = 0;
   for (int i = OrdersHistoryTotal() - 1; i >= 0; i--)
   {
      if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY) && OrderMagicNumber() == Magic && OrderSymbol() == _Symbol)
      {
         bool profit = OrderType() == OP_BUY ? OrderClosePrice() > OrderOpenPrice() : OrderClosePrice() < OrderOpenPrice();
         
         bool loss = OrderType() == OP_BUY ? OrderClosePrice() < OrderOpenPrice() : OrderClosePrice() > OrderOpenPrice();
         
         bool neutral = OrderClosePrice() == OrderOpenPrice();

            SumPosOrder = OrderLots();
            Tiket2 = OrderTicket();
           }


         if(loss)
           {
            n++;
            ObchMin = ObchMin + SumPosOrder; // Подсчет общего минуса
            Minus++;                         //Подсчет отрицательных сделок
            Sdelok++;                        //Подсчет количества сделок
           }

         if(n >= MartinSteps)
           {
            n = 0;
            break;
           }

         if(profit)
           {
            ObchPlus = ObchPlus + (SumPosOrder * 0.8); // Расчет для Бинарных опционов поэтому умножаю на 0,8
           }

         if(profit && ObchPlus < ObchMin)
           {
            n++;
            Pobeda++;
            Sdelok++;
           }



         if(profit && ObchPlus > ObchMin)
           {
            ObchPlus = 0;
            ObchMin = 0;
            Pobeda++;
            Sdelok++;
            n = 0;
            break;
           }
        }
     
   return n;
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
double SelectVolume(int n)
  {
   return
      n == 0 ? Volume1
      : n == 1 ? Volume2
      : n == 2 ? Volume3
      : n == 3 ? Volume4
      : n == 4 ? Volume5
      : n == 5 ? Volume6
      : n == 6 ? Volume7
      : n == 7 ? Volume8
      : n == 8 ? Volume9
      : n == 9 ? Volume10
      : Volume1;
  }
//+------------------------------------------------------------------+

タスクは本来、
最後のクローズド・オーダーを検索する。
プラスまたはマイナスの位置で閉じたかどうかを確認します。
取引回数を カウントする
プラスとマイナスの取引回数をカウントする。

ベット額を計算する。


トレードが黒字の場合(そしてトータルマイナス=0)、ベット番号1
トレードがマイナスの場合、マイナスをカウントしてベット番号2
プラスでもマイナス>0なら次のベット。
でも、なぜかベット数やベット額が正しくカウントされない...。

 

例:文字列

bool neutral = OrderClosePrice() == OrderOpenPrice();

というように、アルゴリズム条件の運用を形成していく必要がありそうです。

   bool neutral=false;

   if(NormalizeDouble(OrderClosePrice(),_Digits) == NormalizeDouble(OrderOpenPrice(),_Digits)neutral=true;

といった具合に、他の2つの条件も同じようなものです。

 

ところで、歴史上の最後の取引が、必ずしも時間上の最後の取引とは限らない。

 
Nikita Chernyshov #:

ところで、歴史上の最後の取引が、時間的にも最後の取引とは限りません。

はい、タイムサンプリングは外しましたが、まだうまくいきません...。
Renat Akhtyamov#:

例えるなら

というような、アルゴリズム的な条件の仕事を形成すべきなのかもしれません。

   bool neutral=false;

   if(NormalizeDouble(OrderClosePrice(),_Digits) == NormalizeDouble(OrderOpenPrice(),_Digits)neutral=true;

といった具合に、他の2つの条件も同じようなものです。

以前、他のシステムでこのブロックを使ったところ、この部分でも完璧に動作しました。
、それでも必ず確認して書き直します。結果はまたお知らせします。
 
Natalya Smirnova #:
はい、タイムサンプリングは外しましたが、まだうまくいきません...。以前、他のシステムでこのブロックを使ったところ、この部分でも完璧に動作しました。 、それでも必ず確認して書き直します。結果はまたお知らせします。

これらの変数はどこかでリセットされているのでしょうか?

            ObchMin = ObchMin + SumPosOrder; // Подсчет общего минуса
            Minus++;                         //Подсчет отрицательных сделок
            Sdelok++;                        //Подсчет количества сделок
 
Renat Akhtyamov #:

これらの変数はどこかでリセットされているのでしょうか?

はい、起動時は0
、完了前は0という値を持っています。
 
Renat Akhtyamov #:

は、これらの変数がどこかでゼロになっているのでしょうか?

マッピングされたものから行くとか。
とりあえずこの関数から統計の収集を外し、一般的なマイナスと統計は別の関数(別の関数が生成する)にする

ブロック単位で書く

統計情報を収集し、マイナスとプラスを計算する(マイナスとプラスはグローバル変数です)

if(OrderSelect((OrdersHistoryTotal() - 1), SELECT_BY_POS, MODE_HISTORY) && OrderMagicNumber() == Magic && OrderSymbol() == _Symbol)
              {
               if(OrderTicket() != Tiket2)
                 {
                  bool profit1 = false;
                  if(OrderClosePrice() > 0)
                    {
                     profit1 = true;
                    }
                  bool loss1 = false;
                  if(OrderClosePrice() < 0)
                    {
                     loss1 = true;
                    }


                  SumPosOrder = OrderLots();
                  Tiket2 = OrderTicket();
                  Print(OrderCloseTime());
                 


               if(loss1)
                 {
                  ObchMin = ObchMin + SumPosOrder;
                  Minus++;
                  Sdelok++;
                 }



               if(profit1)
                 {
                  ObchPlus = ObchPlus + (SumPosOrder * 0.8);
                 }

               if(profit1 && ObchPlus < ObchMin)
                 {

                  Pobeda++;
                  Sdelok++;
                 }




               if(profit1 && ObchPlus > ObchMin)
                 {
                  ObchPlus = 0;
                  ObchMin = 0;
                  Pobeda++;
                  Sdelok++;

                 }
}


ブロック2 - レートの計算(というより選択)のための変数nの選択

int GetN()
  {
   int n = 0;
   for(int i = OrdersHistoryTotal() - 1; i >= 0; i--)
     {
      if(OrderSelect(i, SELECT_BY_POS, MODE_HISTORY) && OrderMagicNumber() == Magic && OrderSymbol() == _Symbol)
        {
         bool profit = false;
         if(OrderClosePrice() > 0)
            profit = true;

         bool loss = false;
         if(OrderClosePrice() < 0)
            loss = true;


        }


      if(loss)
        {
         n++;
        }

      if(n >= MartinSteps)
        {
         n = 0;
         break;
        }

      

      if(profit && ObchPlus < ObchMin)
        {
         n++;
        }



      if(profit && ObchPlus > ObchMin)
        {
         n = 0;
         break;
        }
     }

   Print(n);

   return n;
  }


double SelectVolume(int n)
  {
   return
      n == 0 ? Volume1
      : n == 1 ? Volume2
      : n == 2 ? Volume3
      : n == 3 ? Volume4
      : n == 4 ? Volume5
      : n == 5 ? Volume6
      : n == 6 ? Volume7
      : n == 7 ? Volume8
      : n == 8 ? Volume9
      : n == 9 ? Volume10
      : Volume1;
  }
//+------------------------------------------------------------------+


これはおそらく正しいでしょう...。

 

やはり理屈がわからない。

どうしてですか?

bool profit = false;
         if(OrderClosePrice() > 0)
            profit = true;

         bool loss = false;
         if(OrderClosePrice() < 0)
            loss = true;

注文の終値が 0より小さくなるのはなぜですか?

買い注文は、終値が始値より高ければ利益となります。

は、買いプラスの条件です(手数料、スワップは除く)。

OrderClosePrice() > OrderOpenPrice()
逆であればマイナス
 
Renat Akhtyamov 終値が ゼロより低くなるのはなぜですか?

買い注文は、終値が始値より高ければ利益となります。

は、買いプラスの条件です(手数料、スワップは除く)。

逆であればマイナス

私はバイナリーオプションのために書いているので、少し違ったやり方をしています。

if(OrderProfit() > 0)


これはおそらく正しいでしょう?

 
Natalya Smirnova #:

マッピングされたものから行くとか。
とりあえずこの関数から統計の収集を削除し、合計のマイナスと統計は別の(これから作る別の)関数で行うことにします

ブロック単位での書き込み

累積マイナス・プラス(マイナス・プラスはグローバル変数)


ブロック2 - レートの計算(というより選択)のための変数nの選択


これはおそらく正しいでしょう...。

邪魔をしたくないので、皆さんのコードやTipsに目を通してもいないのですが...。

double SelectVolume(int n)
  {
   return
      n == 0 ? Volume1
      : n == 1 ? Volume2
      : n == 2 ? Volume3
      : n == 3 ? Volume4
      : n == 4 ? Volume5
      : n == 5 ? Volume6
      : n == 6 ? Volume7
      : n == 7 ? Volume8
      : n == 8 ? Volume9
      : n == 9 ? Volume10
      : Volume1;
  }

が目に留まりました。これに関連して質問ですが、switchオペレータを使う方が簡単で可読性が高いのでは?

double SelectVolume(int n)
  {
   double Volume = 0.0;
    switch(n)
    {
     case 1  :  Volume = Volume2;     break;
     case 2  :  Volume = Volume3;     break;
     case 3  :  Volume = Volume4;     break;
     case 4  :  Volume = Volume5;     break;
     case 5  :  Volume = Volume6;     break;
     case 6  :  Volume = Volume7;     break;
     case 7  :  Volume = Volume8;     break;
     case 8  :  Volume = Volume9;     break;
     case 9  :  Volume = Volume10;    break;
     default :  Volume = Volume1;     break;
    }
   return(Volume);
  }
読みやすく、わかりやすくなったと思います。おそらく、動作も少し速くなるのではないでしょうか。
 
Alexey Viktorov #:

アルゴリズム全体のアドバイスは既にされていますし、私は口出ししたくありませんし、あなたのコードも見ていませんし、同じアドバイスでも・・・しかし、この

が目に留まりました。これに関連して質問ですが、switchオペレータを使う方が簡単で可読性が高いのでは?

読みやすく、わかりやすくなったと思います。おそらく、動作も少し速くなるのではないでしょうか。
私はあまり経験がないので、あなたの提案は全く新しいものです。
元々、見つけた方法でやったらうまくいったので、改良しようとは思わなかったんです。
よく言うじゃないですか、「効いてる」「触るな」って。

でも、これからは必ずこの方法を適用してみようと思います。なぜなら、学び、成長するために必要なことだからです。

でも、今は私の変数nだけを扱うことにします。
常にn = 0(これまで)である。