[ARCHIVE]フォーラムを乱立させないために、どんなルーキーの質問でも。プロフェッショナルの皆さん、通り過ぎないでください。あなたなしではどこにも行けない - 5. - ページ 335

 
borilunad:
じゃあ、自分のところで調べてみてよ!コードの単語ごとに関数があり、変数でやりくりしているんですね。その分、コードが重くなるんです。関数がないとどうしようもないときは、関数を使うべきです!キムさんのコードで不要なものはすべてコメントしました。忘れてはいけないのは、「どうしたらいろいろな条件下でプログラムを速く走らせることができるか」ということをみんなに聞いたことだ。5分ですべてのダニを1年間検査することが可能になりました。すべての条件と関数を調べ、不要なものはすべて捨てました。

もちろん覚えていますよ。しばらくはこのままでいい。実際、私は習慣を変える必要があります。私のコードがわかりにくいというのは、プログラマーとして初めてのことではないでしょう。どうやらそうらしい・・・。
 
borilunad:
だから、自分のところで掘れ!コードの単語ごとに関数があり、 変数でやり くりしているんですね。だから、コードが重くなるんですね。 関数がないとどうしようもないときは、関数を使う べきです!キムさんのコードに不要なものをすべてコメントしたら、すべてとても速く動くようになりました。忘れてはいけないのは、「どうしたらいろいろな条件下でプログラムを速く走らせることができるか」ということをみんなに聞いたことだ。5分ですべてのダニを1年間検査することが可能になりました。すべての条件と関数を調べ、不要なものはすべて捨てました。

変数が不要になるのは、テスターでストラテジーをテストする場合のみ です。

実機では、ロジックを実行するために必要なすべての値を、適切なタイミングで計算しなければならない。なぜなら、これらの変数の値は、例えば再起動時に非常に失わ れやすいからである。

 

皆さん、ごきげんよう。

インデックスの書き方はもうわかったのですが、最初のロボットに問題があるんです。論理的には正しいようで、コンパイラは文句を言わず、ジャーナルにもエラーはありませんが、テスターのExpert Advisorが動きません - チャートは開きますが、このグラフに動きはありません(チャートは動きません)。

考え方は次のとおりです。インジケータは、購入または売却するポイントを受け取った後、そこから(常に開口部とろうそくの始値で)ポイントを生成し、同時にロボットのタスクは、反対の順序を閉じて、新しいオープンまたは同じ方向に古い順序を変更します(停止とTPは別の指標によって発行されます)。

どこが間違っているのか、ヒントを頂ければ幸いです。

コードそのもの(機能に応じてインデックス名を変更、変数宣言と エラー処理部分を削除)。

   // Предварит.обработка

   if(High[0]!=Low[0]) return; //если бар открылся до поступления текущей котировки, выход из start

       vverh = iCustom(NULL,0,"Индикатор дающий точку на покупку",Glubina,Pogreshnost,0,0);   //значение индикатора на покупку
       vniz  = iCustom(NULL,0,"Индикатор дающий точку на продажу",Glubina,Pogreshnost,1,0);   //значение индикатора на продажу
       
   if(vverh==0 && vniz==0)
     {
      Alert("Сигнала нет. Эксперт ждёт сигнал.");
      return;
     }
   if(Bars < Glubina)                       // Недостаточно баров
     {
      Alert("Недостаточно баров в окне. Эксперт не работает.");
      return;                                   // Выход из start()
     }
   if(Work==false)                              // Критическая ошибка
     {
      Alert("Критическая ошибка. Эксперт не работает.");
      return;                                   // Выход из start()
     }

//--------------------------------------------------------------- 4 --
   // Учёт ордеров
   Symb=Symbol();                               // Название фин.инстр.
   Total=0;                                     // Количество ордеров
   for(i=1; i<=OrdersTotal(); i++)              // Цикл перебора ордеров
     {
      if (OrderSelect(i-1,SELECT_BY_POS)==true) // Если есть следующий
        {                                       // Анализ ордеров:
         if (OrderSymbol()!=Symb)continue;      // Не наш фин. инструм
         if (OrderMagicNumber()!=MagicNumber)   // Попался ордер открытый не советником
            continue;
            
         Total++;                               // Счётчик ордеров открытых советником
         if (Total>1)                           // Не более одного орд
           {
            Alert("Несколько ордеров одного советника. Эксперт не работает.");
            return;                             // Выход из start()
           }
         Ticket=OrderTicket();                  // Номер выбранн. орд.
         Tip   =OrderType();                    // Тип выбранного орд.
         Price =OrderOpenPrice();               // Цена выбранн. орд.
         SL    =OrderStopLoss();                // SL выбранного орд.
         TP    =OrderTakeProfit();              // TP выбранного орд.
         Lot   =OrderLots();                    // Количество лотов
        }
     }
//--------------------------------------------------------------- 5 --
// торговые критерии
if(vverh>0)
  {
   Opn_B=true;
   Cls_S=true;
   Opn_S=false;
   Cls_B=false;
  }
if(vverh>0)
  {
   Opn_S=true;
   Cls_B=true;
   Opn_B=false;
   Cls_S=false;
  }
  
//--------------------------------------------------------------- 6 --
   
   //расчет стопов
   i_stop=0;
   while (stopov_for_S<2)                                                        //ищем 2 последних точки стопа в индикаторе, выбираем изз них самую дальнюю от текущей цены
         {
          for_S = iCustom(NULL,0,"Индюк дающий точки стопов",Glubina,0,i_stop);
          if (for_S>0)
             {
              stopov_for_S++;
              if(Stop_for_S<for_S) Stop_for_S=for_S;
             }
          i_stop++;
         }
   i_stop=0;
   while (stopov_for_B<2)
         {
          for_B = iCustom(NULL,0,"Индюк дающий точки стопов",Glubina,1,i_stop);
          if (for_B>0)
             {
              stopov_for_B++;
              if(Stop_for_B<for_B) Stop_for_B=for_B;
             }
          i_stop++;
         }
SL_for_B = Stop_for_B-pogreshnostSL;
SL_for_S = Stop_for_S+pogreshnostSL;
TP_for_B=vverh+(vverh-Stop_for_B)*koeff_dvizheniya;
TP_for_S=vniz-(Stop_for_S-vniz)*koeff_dvizheniya;


   // Закрытие и модификация ордеров
   while(true)                                  // Цикл закрытия и модификации орд.
     {
      if (Tip==0 && Opn_B==true)                // Если открыт ордер БАЙ и индикатор дает сигнал на покупку
             {
              OrderModify(Ticket,SL_for_B,TP_for_B,0,CLR_NONE); //меняем стопы текущего ордера бай
              break;
             }
      if (Tip==0 && Opn_S==true)                // Если открыт ордер БАЙ и индикатор дает сигнал на продажу
             {
              RefreshRates();
              Ans=OrderClose(Ticket,Lot,Bid,50);        // закрываем БАЙ
                 if (Ans==true)                         // Получилось :)
                    {
                     Alert ("Закрыт ордер Buy ",Ticket);
                     break;                             // Выход из цикла закр
                    }
                 if (Fun_Error(GetLastError())==1)      // Обработка ошибок
                     continue;                          // Повторная попытка
             }
      
      if (Tip==1 && Opn_S==true)
             {
              OrderModify(Ticket,SL_for_S,TP_for_S,0,CLR_NONE);
              break;
             }
      if (Tip==1 && Opn_B==true)
             {
              RefreshRates();
              Ans=OrderClose(Ticket,Lot,Ask,50);
                 if (Ans==true)                         // Получилось :)
                    {
                     Alert ("Закрыт ордер Sell ",Ticket);
                     break;                             // Выход из цикла закр
                    }
                 if (Fun_Error(GetLastError())==1)      // Обработка ошибок
                     continue;                          // Повторная попытка
             }
     }
//--------------------------------------------------------------- 7 --
   // Стоимость ордеров
   RefreshRates();                              // Обновление данных
   Min_Lot=MarketInfo(Symb,MODE_MINLOT);        // Миним. колич. лотов 
   Free   =AccountFreeMargin();                 // Свободн средства
   One_Lot=MarketInfo(Symb,MODE_MARGINREQUIRED);// Стоимость 1 лота
   Step   =MarketInfo(Symb,MODE_LOTSTEP);       // Шаг изменен размера

   if (Lots > 0)                                // Если заданы лоты,то 
      Lts =Lots;                                // с ними и работаем 
   else                                         // % свободных средств
      Lts=MathFloor(Free*Prots/One_Lot/Step )*Step;// Для открытия

   if(Lts < Min_Lot) Lts=Min_Lot;               // Не меньше минимальн
   if (Lts*One_Lot > Free)                      // Лот дороже свободн.
     {
      Alert(" Не хватает денег на ", Lts," лотов");
      return;                                   // Выход из start()
     }
//--------------------------------------------------------------- 8 --
   // Открытие ордеров
   while(true)                                  // Цикл закрытия орд.
     {
      Ticket=0;
      if (Opn_B==true)                          // Открытых орд. нет +
        {                                       // критерий откр. Buy
         RefreshRates();                        // Обновление данных
         Alert("Попытка открыть Buy. Ожидание ответа..");
         Ticket=OrderSend(Symb,OP_BUY,Lts,Ask,50,SL_for_B,TP_for_B,"My order #",MagicNumber,0,CLR_NONE);//Открытие Buy
         if (Ticket > 0)                        // Получилось :)
           {
            Alert ("Открыт ордер Buy ",Ticket);
            return;                            // Выход из start()
           }
         if (Fun_Error(GetLastError())==1)      // Обработка ошибок
            continue;                           // Повторная попытка
         return;                                // Выход из start()
        }
        
      if (Opn_S==true)                          // Открытых орд. нет +
        {                                       // критерий откр. Buy
         RefreshRates();                        // Обновление данных
         Alert("Попытка открыть Sell. Ожидание ответа..");
         Ticket=OrderSend(Symb,OP_SELL,Lts,Bid,50,SL_for_S,TP_for_S,"My order #",MagicNumber,0,CLR_NONE);//Открытие Sell
         if (Ticket > 0)                        // Получилось :)
           {
            Alert ("Открыт ордер Buy ",Ticket);
            return;                            // Выход из start()
           }
         if (Fun_Error(GetLastError())==1)      // Обработка ошибок
            continue;                           // Повторная попытка
         return;                                // Выход из start()
        }
     }
//--------------------------------------------------------------- 9 --
   return;                                      // Выход из start()
  }

 
If (торговые условия сигнал №1)
  {
  }//   Какой код нужен, чтобы тело оператора №1 в случае соответствия, передало управление к оператору  «торговых       условий №2»    

If (торговые условия сигнал №2)
  {
  }// Какой код нужен, чтобы тело оператора №2 в случае соответствия, передало управление к оператору «торговых       условий №3 и №4»    

If (торговые условия сигнал №3)
  {                                          
   Opn_B=true;                            
   }
   else
If (торговые условия сигнал №4)
  {                                          
   Opn_S=true;                            
   }
     else
         return(0);

問題の本質は次のようなものだ。演算子#1,2 の本文で波括弧の中に何を入れるか明確でない。実際には、取引条件の遵守が確認され、それ以上のアクションはない。

(4つの売買シグナルがあり、1番のトリガーで2番の処理シグナルに制御を渡し、2番のトリガーで3番と4番の処理シグナルに渡し、そこで売買操作を 行う)。

  else
         return(0);

最後に追加する意味はあるのでしょうか?論理的には、シグナル#3,4がトリガーされない場合、Expert Advisorを再度起動する必要があります。

 
artmedia70:

変数は、テスターでストラテジーをテストするときのみ使用 できます。

実世界では、ロジックの実行に必要なすべての値を適切なタイミングで計算する必要があります。これらの変数の値は、例えば再起動時に非常に失わ れやすいためです。

しかし、externに書かれた変数は失われてしまうのでしょうか?そんなことは一度もなかった!しかし、すべての条件は目の前にあり、手元にあるのはstart()であり、start()の外にある関数は、チェックと最終的に変更できないアクションを持っています大きく間違っているかもしれませんが、今のところこの方法で快適に過ごしていますし、Realではまだ一度もエラーやレーキバックを受け取っていませんアルテムさんや、alsu さん、ミート さん等、経験豊富なプログラマーさん、そしてゲストモデレーターの方の投稿をいつもしっかり読ませていただいていますよ。でも、まだすべてが自分の能力の範囲内ではないので、まだはっきりしないことを細かいところまで応用することはできません。いつもありがとうございます
 
barma:

皆さん、ごきげんよう。

インデックスの書き方はもうわかったのですが、最初のロボットに問題があるんです。論理的には正しいようで、コンパイラは文句を言わず、ジャーナルにもエラーはありませんが、テスターのExpert Advisorが動きません - チャートは開きますが、このグラフに動きはありません(チャートは動きません)。

考え方は次のとおりです。インジケータは、購入または売却するポイントを受け取った後、そこから(常に開口部とろうそくの始値で)ポイントを生成し、同時にロボットのタスクは、反対の順序を閉じて、新しいオープンまたは同じ方向に古い順序を変更します(停止とTPは別の指標によって発行されます)。

どこが間違っているのか、ヒントを頂ければ幸いです。

コードそのもの(機能に応じてインデックス名を変更、変数宣言とエラー処理部分を削除)。

もし、チャート上の対応するウィンドウに表示されるインジケータコードそのものではなく、EA内のインジケータ名だけを置き換えた場合、EAはインジケータから何も受信せず、EAには全てが表示されるがインジケータからの信号は 受信しないため、エラーは発生しないことになります。指標の名前が、指標自体で同じ綴りになっているかどうかを確認しましょう
 
borilunad:
もし、チャート上の対応するウィンドウに表示されるインジケーターのコードではなく、EAの中だけでインジケーターの名前を変更した場合、EAにはすべてが表示されますが、インジケーターからのシグナルは受信されないため、EAは何も受信せずエラーも発生しません。指標名のスペルが同じかどうか確認しましょう

ご指摘ありがとうございます。今一度、すべてを確認しましたが、書き間違いはありません。私は、そのタスクを明確にするために、フォーラムの最初のメッセージのテキストで指標の名前を変更しただけで、Expert Advisorのテキストでは、インデックスの名前は、フォルダ "indicators "にある名前とまったく同じように書かれています。例えば、こんな感じです。"3.0_figuri_2.3_rasshirenie".

また、別のEA(チュートリアルより)を選択し、iCustom関数に存在しないインジケータの名前を入力しています。EAが本当に取引を停止したのです(これは理解できます)。しかし、テスターを起動すると、チャートは設定した開始日から設定した終了日まで動いていました。

もしかしたら、この問題に直面した人がいるかもしれませんね。

 
barma:

ご指摘ありがとうございます。今一度、すべてを確認しましたが、書き間違いはありません。私は、そのタスクを明確にするために、フォーラムの最初のメッセージのテキストで指標の名前を変更しただけで、Expert Advisorのテキストでは、インデックスの名前は、フォルダ "indicators "にある名前とまったく同じに書かれています。例えば、こんな感じです。"3.0_figuri_2.3_rasshirenie".

また、別のEA(チュートリアルより)を選択し、iCustom関数に存在しないインジケータの名前を入力しています。EAが本当に取引を停止したのです。(ところで、これは理解できるのですが)テスターを起動すると、チャートは設定した開始日から設定した終了日まで移動していました。

もしかしたら、そんな悩みを抱えている人がいたかもしれない。

フォルダ内ではなく、コード内のインジケータの名前を確認してください:「短い名前」、それによってExpert Advisorは、それがまだ適切なチャートとTFにインストールされている場合は、それを認識するからです
 
テスターで何かを描くには、チャート上にインジケータが設置されている必要があり、EA自体は線を描きません
 
barma:

ご指摘ありがとうございます。今一度、すべてを確認しましたが、書き間違いはありません。私は、そのタスクを明確にするために、フォーラムの最初のメッセージのテキストで指標の名前を変更しただけで、Expert Advisorのテキストでは、インデックスの名前は、フォルダ "indicators "にある名前とまったく同じように書かれています。例えば、こんな感じです。"3.0_figuri_2.3_rasshirenie".

また、別のEA(チュートリアルより)を選択し、iCustom関数に存在しないインジケータの名前を入力しています。何が起こったかというと、次のようなことでした。EAは本当に取引を停止したのですが(ちなみにこれは理解できます)、テスターを起動すると、チャートは設定した開始日から設定した終了日まで動いていたのです。

もしかしたら、そんな悩みを抱えている人がいたかもしれませんね。

週末はオフィスで、グラフが動かないように。