[ARCHIVE !] Toute question de débutant, pour ne pas encombrer le forum. Professionnels, ne passez pas à côté. Nulle part sans toi - 4. - page 359

 
veti-k:

Non, c'est trop. Ce qui est plus volatile d'au moins 20-50 pips
USDJPY
 

Les gars, vous pouvez me conseiller :

En testant le conseiller sur les indicateurs standard inclus dans la livraison de MT4 sur les paires de devises - aucun problème - tout fonctionne selon l'algorithme de trading.

Lors des tests sur les métaux, tels que l'argent et l'or, les ordres ne sont pas ouverts, dans le journal du testeur de stratégie ils écrivent la division zéro.

J'ai les mêmes paramètres d'entrée, l'historique de cette société de courtage à cinq chiffres (forex4yu) a été téléchargé pour les instruments testés.

Quelle est la raison possible ? Je ne veux pas envoyer mon EA à un télépathe. J'ai personnellement écrit le Conseiller Expert selon la version du livre.

 
Roman.:

Les gars, vous pouvez me conseiller :

En testant le conseiller sur les indicateurs standard inclus dans la livraison de MT4 sur les paires de devises - aucun problème - tout fonctionne selon l'algorithme de trading.

Lors des tests sur les métaux, tels que l'argent et l'or, les ordres ne sont pas ouverts, dans le journal du testeur de stratégie ils écrivent la division zéro.

J'ai les mêmes paramètres d'entrée, l'historique de cette société de courtage à cinq chiffres (forex4yu) a été téléchargé pour les instruments testés.

Quelle est la raison possible ? Je ne veux pas envoyer mon EA à un télépathe. J'ai personnellement écrit le Conseiller Expert selon la version du livre.

Lorsqu'on divise par une variable, il faut d'abord vérifier qu'elle n'est pas égale à zéro.
 
Roman.:

Les gars, vous pouvez me conseiller :

En testant le conseiller sur les indicateurs standard inclus dans la livraison MT4 sur les paires de devises - aucun problème - tout fonctionne selon l'algorithme de trading.

Lors des tests sur les métaux, comme l'argent et l'or, les ordres ne sont pas ouverts, dans le fichier journal du testeur de stratégie, ils sont divisés par zéro.

J'ai les mêmes paramètres d'entrée, l'historique de cette société de courtage à cinq chiffres (forex4yu) a été téléchargé pour les instruments testés.

Quelle est la raison possible ? Je ne veux pas envoyer mon EA à un télépathe. J'ai personnellement écrit le Conseiller Expert selon la version du livre.


Vous devriez voir le code. En général, vous pouvez (dans Notepad++) marquer automatiquement tous les endroits où un signe de division apparaît dans le code et voir si la division par zéro se produit effectivement dans certains cas.
 
drknn:

J'aimerais voir le code. Et en général, vous pouvez (dans Notepad++) marquer automatiquement tous les endroits où le signe de division apparaît dans le code et vérifier si dans certains cas la division par zéro se produit réellement.


Oui, je regarde déjà les empreintes où le déballage est arrivé, tout y est bien...

Dans la fonction de normalisation du volume pour les métaux il y avait cette erreur (division par zéro), maintenant il n'est pas présent, il y avait un autre 131 - volume incorrect, bien que fixé évidemment = 0,01 lot, je regarde en général ...

Pour les monnaies, cette fonction de normalisation du volume fonctionne correctement..... Peut-être y a-t-il un point commun entre eux (pour les métaux et les devises) ?

//--------------------------------------------------------------------
// Lot_MM.mqh
// 
//--------------------------------------------------------------- 1 --
// Функция вычисления количества лотов.
// Глобальные переменные:
// double Lots_New - количество лотов для новых ордеров (вычисляется)
// double Lots     - желаемое количество лотов, заданное пользовател.
// double  MaksRisk  - процент риска
// Возвращаемые значения:
// true  - если средств хватает на минимальный лот
// false - если средств не хватает на минимальный лот
//--------------------------------------------------------------- 2 --
bool Lot_MM()                            // Позовательская ф-ия
  {
   int time, ticket;                  // Наибольшее время открытия и номер ордера
   double orderLots;                  // Lots   
   double orderProfit;                // Profit
   double Price;                      // Цена открытия рыночного ордера
   double SL;                         // Значение StopLoss ордера
   double  TP;                        // Значение TakeProfit ордера
   string Symb   =Symbol();                    // Финансовый инструм.
   double One_Lot=MarketInfo(Symb,MODE_MARGINREQUIRED);//Размер свободных средств, необходимых для открытия 1 лота
   double Min_Lot=MarketInfo(Symb,MODE_MINLOT);// Мин. размер. лотов
   double Max_Lot =MarketInfo(Symbol(),MODE_MAXLOT);
   double Step   =MarketInfo(Symb,MODE_LOTSTEP);//Шаг изменен размера
   double Free   =AccountFreeMargin();         // Свободные средства
   double LotVal =MarketInfo(Symbol(),MODE_TICKVALUE);//стоимость 1 пункта для 1 лота
   

//--------------------------------------------------------------- 3 --
   if (Lots>0)                                 // Лоты заданы явно..
{                                              // ..проверим это
      double Money=Lots*One_Lot;               // Стоимость открываемого ордера   
      if(Money<=AccountFreeMargin())             // Средств хватает..     
         {  
          Lots_New=Lots;                           // ..принимаем заданное
            // else                                     // Если не хватает..
            // Lots_New=MathFloor(Free/One_Lot/Step)*Step;// Расчёт лотов 
            Print("Функция Lot_MM: Lots_New  = ", Lots_New);    
...
...
...
...
 // ---------НОРМАЛИЗУЕМ НОВЫЕ РАСЧЕТНЫЕ ЛОТЫ И ОТКРЫВАЕМ ОЧЕРЕДНУЮ ПОЗИЦИЮ...            
                    Lots_New = NormalizeLots(Lots_New);  
   return(true);                               // Выход из польз. ф-ии
  }
//--------------------------------------------------------------- 6 --

//+------------------------------------------------------------------+
//| Нормализация лота                                                |
//+------------------------------------------------------------------+

double NormalizeLots(double lot)
{
   double lotStep = MarketInfo(Symbol(), MODE_LOTSTEP);
   double lots = NormalizeDouble(lot / lotStep, 0) * lotStep;   
   lots = MathMax(lots, MarketInfo(Symbol(), MODE_MINLOT));
   lots = MathMin(lots, MarketInfo(Symbol(), MODE_MAXLOT));   
   return (lots);
}
 

Je ne comprends pas : il imprime la ligne du haut, mais l'ordre ne s'ouvre pas avec l'erreur 131 - mauvais volume, j'ai déjà mis 0.1 et 0.01...

 Print ("Функция открытия ордера с рынка - продажа: Teeth = ",  NormalizeDouble(Teeth,Digits), " upfractal = ", upfractal," Цена Bid = ", NormalizeDouble(Bid,Digits), " Lots_New = ", NormalizeDouble(Lots_New,2));                
Ticket=OrderSend(Symbol(),1,0.01,Bid,50,0,0,"Antiunity-start",Magic,0,Red);    

 
Techno:
Lorsqu'on divise par une variable, il faut d'abord vérifier qu'elle n'est pas égale à zéro.

Merci, je garderai cela à l'esprit à l'avenir. C'est juste que cette fois, j'ai pris une fonction de normalisation du volume toute prête.
 

Aucune utilité jusqu'à présent... Ecrit la même erreur...

 Print ("Функция открытия ордера с рынка - продажа: Teeth = ",  NormalizeDouble(Teeth,Digits), " upfractal = ", upfractal," Цена Bid = ", NormalizeDouble(Bid,Digits), " Lots_New = ", NormalizeDouble(Lots_New,2));                
          Ticket=OrderSend(Symbol(),1,Lots_New,Bid,50,0,0,"Antiunity-start",Magic,0,Red);            
          Print ("Функция открытия ордера с рынка - продажа: старт");      

J'ai ouvert une position sur l'or sur mon compte dans le testeur avec 10 000 et des lots de 0,01 et 0,1 - en vain.

Peut-être que quelqu'un a eu un problème similaire ? Un conseil, s'il vous plaît...

 

Ajoutez ma fonction de vérification des lots à vos sous-programmes personnalisés. Et l'appeler avant chaque OrderSend(). L'arrondi dans mon dll est fait par les lois des mathématiques : si le nombre arrondi se termine par une partie fractionnaire avec un nombre >=5, alors il est arrondi vers le haut. Si <=4, il est arrondi à l'inférieur. D'après ce que j'ai compris, les langages de programmation ont des problèmes avec cela pour une raison quelconque - j'ai dû créer mon propre code dll. En fait, le code est très simple, mais j'ai beaucoup cherché sur Internet à mon époque, avant de trouver la solution optimale. Avez-vous besoin du code source de la dll ?

// ============ ProverkaLota() =====================================================================
// функция принимает нормализует лот ордера
//-----------------------------------------------------
double ProverkaLota(double LotOrdera,string SMB){
  double SMB_MinLot=MarketInfo(SMB,MODE_MINLOT);
  double SMB_MaxLot=MarketInfo(SMB,MODE_MAXLOT);
  double SMB_LotStep=MarketInfo(SMB,MODE_LOTSTEP);
  LotOrdera=OkruglenieDoSotykh(LotOrdera);// округляем до сотых

 if(SMB_LotStep==0.1){// округляем до десятых
   LotOrdera/=10;
   LotOrdera=OkruglenieDoSotykh(LotOrdera);
   LotOrdera*=10;// возвращаем дробную часть ордера на место
 }
 if(LotOrdera<SMB_MinLot){
   LotOrdera=SMB_MinLot;
 }
 if(LotOrdera>SMB_MaxLot){
   LotOrdera=SMB_MaxLot;
 }
 return(LotOrdera);
}
// =================================================================================================
Dossiers :
basic_dll_1.zip  190 kb
 
drknn:

Ajoutez ma fonction de vérification des lots à vos sous-programmes personnalisés. Et l'appeler avant chaque OrderSend(). L'arrondi dans mon dll est fait par les lois des mathématiques : si le nombre arrondi se termine par une partie fractionnaire avec un nombre >=5, alors il est arrondi vers le haut. Si <=4, il est arrondi à l'inférieur. D'après ce que j'ai compris, les langages de programmation ont des problèmes avec cela pour une raison quelconque - j'ai dû créer mon propre code dll. En fait, le code est très simple, mais j'ai beaucoup cherché sur Internet à mon époque, avant de trouver la solution optimale. Avez-vous besoin du code source de la dll ?


Oui. Merci.