[ARCHIVE]Toute question de débutant, afin de ne pas encombrer le forum. Professionnels, ne passez pas à côté. Je ne peux aller nulle part sans toi - 5. - page 335

 
borilunad:
Alors, creusez chez vous ! Vous avez une fonction pour chaque mot de votre code, et vous devez vous contenter de variables. C'est pourquoi votre code est lourd. Il faut utiliser les fonctions quand on ne peut pas s'en passer! J'ai commenté tout ce dont je n'ai pas besoin dans le code de Kim, et tout fonctionne très vite ! Rappelez-vous, j'ai demandé à tout le monde comment rendre le programme plus rapide dans de nombreuses conditions. Maintenant, le test fonctionne pendant un an sur toutes les tiques en 5 minutes ! J'ai passé au peigne fin toutes les conditions et fonctions et j'ai jeté tout ce qui était inutile.

On ne peut se passer des variables que si l'on teste la stratégie dans le testeur.

Pour le réel, chaque valeur nécessaire à l'exécution de la logique doit être calculée au bon moment, car les valeurs de ces variables sont très faciles à perdre, par exemple lors d'un redémarrage.

 

Bonne journée à vous tous.

J'ai déjà compris comment écrire les indices, mais j'ai des problèmes avec le premier robot. Cela semble logique, le compilateur ne se plaint pas, le journal n'a pas d'erreurs, mais le conseiller expert dans le testeur ne fonctionne pas - le graphique s'ouvre, mais il n'y a aucun mouvement sur ce graphique (le graphique ne bouge pas).

L'idée est la suivante : L'indicateur produit un point (toujours à l'ouverture et au prix d'ouverture de la bougie) à partir duquel acheter ou vendre, la tâche du robot en même temps, après avoir reçu un point à acheter ou à vendre, fermer l'ordre opposé, ouvrir un nouvel ordre ou modifier un ancien ordre dans la même direction (les stops et les TP sont émis par un autre indicateur).

Je vous serais très reconnaissant de m'indiquer où il y a une erreur.

Le code lui-même (changement des noms des indices en fonction de leur fonctionnalité, suppression de la déclaration des variables et de la section de gestion des erreurs) :

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

   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);

L'essence du problème est la suivante : il n'est pas clair ce qu'il faut mettre entre crochets dans le corps des opérateurs #1,2 en fait il y a vérification de la conformité des conditions commerciales et plus d'actions.

(Il y a quatre signaux de trading, le numéro 1 déclenche, on passe le contrôle au signal de traitement numéro 2, le numéro 2 déclenche, on le passe aux signaux de traitement numéro 3 et 4 et on y effectue des opérations de trading).

  else
         return(0);

Cela vaut-il la peine de l'ajouter à la fin ? Logiquement, si les signaux 3 et 4 ne se déclenchent pas, il faut que le conseiller expert recommence.

 
artmedia70:

Les variables ne peuvent être utilisées que lors du test de la stratégie dans le testeur.

Dans le monde réel, chaque valeur nécessaire à l'exécution de la logique doit être calculée au bon moment, car les valeurs de ces variables sont très faciles à perdre, par exemple lors d'un redémarrage.

Mais les variables écrites dans l'extern sont-elles perdues ? Cela n'est jamais arrivé ! Mais toutes les conditions sont sous mes yeux et à portée de main dans start(), et les fonctions, qui sont en dehors de start(), ont des contrôles et des actions finales non modifiables ! Je peux avoir tort dans l'ensemble, mais jusqu'à présent, je suis à l'aise de cette façon, et je n'ai pas encore reçu une seule erreur ou rakeback sur Real ! Je lis toujours attentivement tes messages, Artem, et ceux d'autres programmeurs expérimentés comme alsu, Meat et d'autres, ainsi que les modérateurs invités ! Mais tout n'est pas encore à ma portée, et je ne peux donc pas appliquer dans les moindres détails ce qui n'est pas encore clair pour moi. merci pour tout !
 
barma:

Bonne journée à vous tous.

J'ai déjà compris comment écrire les indices, mais j'ai des problèmes avec le premier robot. Cela semble logique, le compilateur ne se plaint pas, le journal n'a pas d'erreurs, mais le conseiller expert dans le testeur ne fonctionne pas - le graphique s'ouvre, mais il n'y a aucun mouvement sur ce graphique (le graphique ne bouge pas).

L'idée est la suivante : L'indicateur produit un point (toujours à l'ouverture et au prix d'ouverture de la bougie) à partir duquel acheter ou vendre, la tâche du robot en même temps, après avoir reçu un point à acheter ou à vendre, fermer l'ordre opposé, ouvrir un nouvel ordre ou modifier un ancien ordre dans la même direction (les stops et les TP sont émis par un autre indicateur).

Je vous serais très reconnaissant de m'indiquer où il y a une erreur.

Le code lui-même (changement des noms des indices en fonction de leur fonctionnalité, suppression de la déclaration des variables et de la section de gestion des erreurs) :

Si vous avez remplacé les noms des indicateurs seulement dans l'EA, et pas aussi dans les codes des indicateurs eux-mêmes, qui sont affichés dans les fenêtres correspondantes sur les graphiques, alors l'EA ne recevra rien d'eux, et l'erreur n'est pas donnée, parce que tout est présenté dans l'EA, mais il ne reçoit pas de signaux des indicateurs. Vérifiez si les noms des indicateurs sont orthographiés de la même façon dans les indicateurs eux-mêmes !
 
borilunad:
Si vous avez changé les noms des indicateurs seulement dans l'EA, et pas dans les codes des indicateurs eux-mêmes, qui sont affichés dans les fenêtres correspondantes sur les graphiques, alors l'EA ne recevra rien d'eux et ne donnera pas d'erreur, parce que tout est présenté dans l'EA, mais il ne reçoit pas de signaux des indicateurs. Vérifiez si les noms des indicateurs sont orthographiés de la même façon !

Merci pour le conseil, j'ai tout vérifié une fois de plus, il n'y a aucune erreur dans l'écriture. J'ai seulement changé les noms des indicateurs dans le texte du premier message sur le forum, afin de rendre leur tâche claire, dans le texte du Conseiller Expert les noms des indices sont écrits exactement comme ils sont nommés dans le dossier "indicateurs". Par exemple : "3.0_figuri_2.3_rasshirenie".

De plus, j'ai sélectionné un autre EA (du tutoriel) et saisi les noms d'indicateurs inexistants dans la fonction iCustom. Ce qui s'est passé est le suivant - l'EA s'est vraiment arrêté de fonctionner (ce qui est, soit dit en passant, compréhensible), mais lorsque j'ai démarré le testeur, le graphique se déplaçait de la date de début à la date de fin, je dois vous rappeler que mon problème est que le graphique ne se déplace pas.

Peut-être que quelqu'un d'autre a été confronté à ce problème ?

 
barma:

Merci pour le conseil, j'ai tout vérifié une fois de plus, il n'y a aucune erreur dans l'écriture. J'ai seulement changé les noms des indicateurs dans le texte du premier message sur le forum, afin de rendre leur tâche claire, dans le texte du Conseiller Expert les noms des indices sont écrits exactement comme ils sont nommés dans le dossier "indicateurs". Par exemple : "3.0_figuri_2.3_rasshirenie".

De plus, j'ai sélectionné un autre EA (du tutoriel) et saisi les noms d'indicateurs inexistants dans la fonction iCustom. Ce qui s'est passé est le suivant - l'EA s'est vraiment arrêté de fonctionner (ce qui est, soit dit en passant, compréhensible), mais lorsque j'ai démarré le testeur, le graphique se déplaçait de la date de début à la date de fin, je dois rappeler que le problème est que le graphique ne se déplace pas.

Peut-être que quelqu'un d'autre a eu ce problème.

Vérifiez le nom de l'indicateur, non pas dans le dossier, mais dans son code : "nom court", car c'est par lui que le Conseiller Expert le reconnaît, s'il est toujours installé sur le graphique approprié et le TF !
 
Pour que l'indicateur dessine quelque chose dans le testeur, il doit être installé sur le graphique, l'EA lui-même ne dessinera pas de lignes.
 
barma:

Merci pour le conseil, j'ai tout vérifié une fois de plus, il n'y a aucune erreur dans l'écriture. J'ai seulement changé les noms des indicateurs dans le texte du premier message sur le forum, afin de rendre leur tâche claire, dans le texte du Conseiller Expert les noms des indices sont écrits exactement comme ils sont nommés dans le dossier "indicateurs". Par exemple : "3.0_figuri_2.3_rasshirenie".

De plus, j'ai sélectionné un autre EA (du tutoriel) et saisi les noms d'indicateurs inexistants dans la fonction iCustom. Ce qui s'est passé est le suivant - l'EA s'est vraiment arrêté de fonctionner (ce qui est, soit dit en passant, compréhensible), mais lorsque j'ai démarré le testeur, le graphique se déplaçait de la date de début à la date de fin, je dois vous rappeler que le problème est que le graphique ne se déplace pas.

Peut-être que quelqu'un d'autre a eu ce problème ?

Week-end aux bureaux, pour que le graphique ne bouge pas.
 

Et Barma, assure-toi

//--------------------------------------------------------------- 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 --
si vous avez épelé les conditions correctement