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

 
 if ((Opb==0) && (MA_1_t > MA_2_t + Rastvor*Point))           // Если разница между
     {                                          // ..МА 1 и 2 большая
      Opn_B=true;                               // Критерий откр. Buy
      Cls_S=true;                               // Критерий закр. Sell
      Opb++;					// Открытие только одного ордера
      Ops=0;
         if (VKO1>=Ask) {VP=VP*Koff;} 		// При прибыли предыдущего умножать на коэф.
         if (VKO1<Ask) {VP=VP*Koff1;}		// При убытке предыдущего умножать на коэф1.
      }
 if ((Ops==0) && (MA_1_t < MA_2_t - Rastvor*Point))           // Если разница между
     {                                          // ..МА 1 и 2 большая
      Opn_S=true;                               // Критерий откр. Sell
      Cls_B=true;                               // Критерий закр. Buy
      Ops++;					// Открытие только одного ордера
      Opb=0;
         if (VKO0<=Bid) {VP=VP*Koff;} 		// При прибыли предыдущего умножать на коэф
         if (VKO0>Bid) {VP=VP*Koff1;}		// При убытке предыдущего умножать на коэф1
      }
      
if ((Opn_S==true)||(Opn_B==true))      		// Если есть сигнал на открытие ордера
      {						// Вычисляем объем умножая на VP
      if (AccountBalance()<50000) Vol=Opn_Lots*VP;
      if (AccountBalance()>50000) Vol=2*Opn_Lots*VP;
      }
Je n'arrive pas à trouver où se trouve l'erreur, veuillez me conseiller. Il dit "pas assez d'argent pour acheter Lts=1.#INF"
 

Et vérifier si le dépôt est suffisant ? https://docs.mql4.com/ru/constants/marketinfo

Et vérifiez le lot sur la sortie ?

 

C'est le problème... Le nombre de lots croît à l'infini, c'est-à-dire que l'augmentation du volume est bouclée, et par code, il s'avère que c'est une augmentation ponctuelle...

Après cela pour être clair voir ci-dessous. et donc la même chose avec Sell

if (Total==0 && Opn_B==true)         // Открытых орд. нет  
            {                                   // критерий откр. Buy
            RefreshRates();                     // Обновление данных
                                  
            Min_Lot=MarketInfo(Symb,MODE_MINLOT);  // Миним. колич. лотов 
            Free   =AccountFreeMargin();           // Свободн средства
            One_Lot=MarketInfo(Symb,MODE_MARGINREQUIRED);// Стоимость 1 лота
            Step   =MarketInfo(Symb,MODE_LOTSTEP); // Шаг изменен размера
            Lts=MathFloor(Vol);                    // Для открытия 
            Alert ("Lts ", Lts);
            if(Lts < Min_Lot) Lts=Min_Lot;         // Не меньше минимальн
            if (Lts*One_Lot < Free) Alert(" Не хватает денег на ", Lts," лотов"); // Лот дороже свободн.
            
            SL=Ask-StopLoss_Open*Point;            // Вычисление SL откр.
            TP=Ask+TakeProfit_Open*Point;          // Вычисление TP откр.
            Alert("Попытка открыть Buy. Ожидание ответа..");
            Ticket=OrderSend(Symb,OP_BUY,Lts,Ask,2,SL,TP); //Открытие Buy
            if (Ticket > 0)                        // Получилось :)
                {
                Alert ("Открыт ордер Buy ",Ticket);
                VKO0=Ask; Opn_B =false; KO++;
                Alert ("Цена открытия =", VKO0);
                }
             
            
            if (Fun_Error(GetLastError())==1)   // Обработка ошибок
            continue;                           // Повторная попытка
                                         
            }
 
            continue;                           // Повторная попытка

il s'agit d'un "cas unique" ?

Cap, c'est évident, il y a un cycle.

 
sergeev, vous n'avez peut-être pas les idées claires... c'est un cycle en cas d'erreur d'ouverture, pas pour augmenter le nombre de lots.
 

Bonjour !

Je ne trouve pas de réponse à la question suivante :

Si un ordre en attente est exécuté, son type reste le même que celui de l'ordre en attente, ou est-il changé en OP_BUY ou OP_SELL ?

 
oDin48:

C'est le problème... Le nombre de lots croît à l'infini, c'est-à-dire que l'augmentation du volume est bouclée, et par code, il s'avère que c'est une augmentation ponctuelle...

Après cela pour être clair voir ci-dessous. et donc la même chose avec Sell

Essayez
if (Fun_Error(GetLastError())==0)   // Нет ошибки
break; 
S'il y a une erreur, il essaiera simplement d'ouvrir à nouveau une position sur un nouveau tick. A propos, on m'a expliqué ici sur ce forum (p. 90-91) qu'il est conseillé de ne pas utiliser l'opérateur && (et) dans if.
 
gogent:

Si un ordre en attente est exécuté, est-il toujours le même que l'ordre en attente, ou est-il changé en OP_BUY ou OP_SELL ?

Oui, bien sûr.
 

Quelqu'un sait-il comment convertir le nombre de pips en monnaie ?

c'est-à-dire que si le bénéfice est en unités de monnaie, alors 50 pips doivent être convertis en unités de monnaie... c'est-à-dire que l'effet de levier doit être pris en compte... ? 0_о

 

paladin80, le problème n'est pas d'ouvrir une commande... il fonctionne bien... J'ai écrémé cette partie pour préciser quelles variables du post du 01.05.12 19:15 ont été utilisées par la suite...

le problème est le suivant (voir ci-dessous), c'est une exécution unique et pour une raison quelconque, le Vol augmente à l'infini, donc le Lts augmente à l'infini... ce n'est pas clair... veuillez voir le message en question et dites-moi ce qui ne va pas...

if ((Opn_S==true)||(Opn_B==true))               // Если есть сигнал на открытие ордера
      {                                         // Вычисляем объем умножая на VP
      if (AccountBalance()<50000) Vol=Opn_Lots*VP;
      if (AccountBalance()>50000) Vol=2*Opn_Lots*VP;
      }