[Qualsiasi domanda da principiante, per non ingombrare il forum. Professionisti, non passate oltre. Da nessuna parte senza di te - 4. - pagina 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;
      }
Non riesco a capire dove sia l'errore, per favore consigliatemi. Dice "non ci sono abbastanza soldi per comprare Lts=1.#INF".
 

E controllare la sufficienza del deposito? https://docs.mql4.com/ru/constants/marketinfo

E controllare il lotto in uscita?

 

Questo è il problema... Il numero di lotti cresce all'infinito, cioè l'aumento di volume è in loop, e per codice risulta essere un aumento una tantum...

Dopo di che per renderlo chiaro vedi sotto. e quindi lo stesso con 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;                           // Повторная попытка

è un cosiddetto "pezzo unico"?

cap, è ovvio, c'è un ciclo.

 
sergeev, forse non hai le idee chiare... è un ciclo se si verifica un errore di apertura, non per aumentare il numero di lotti.
 

Ciao!

Non riesco a trovare una risposta alla seguente domanda:

Se un ordine pend ente viene eseguito, il suo tipo è ancora lo stesso dell'ordine pendente o viene cambiato in OP_BUY o OP_SELL?

 
oDin48:

Questo è il problema... Il numero di lotti cresce all'infinito, cioè l'aumento di volume è in loop, e per codice risulta essere un aumento una tantum...

Dopo di che per renderlo chiaro vedi sotto. e quindi lo stesso con Sell

Prova
if (Fun_Error(GetLastError())==0)   // Нет ошибки
break; 
Se c'è un errore, cercherà semplicemente di aprire di nuovo una posizione su un nuovo tick. A proposito, mi è stato spiegato qui su questo forum (p. 90-91) che è consigliabile non usare l'operatore && (e) in if.
 
gogent:

Se l'ordine pendente viene eseguito, è ancora lo stesso dell'ordine pendente o viene cambiato in OP_BUY o OP_SELL?

Sì, certo che è così.
 

Qualcuno sa come convertire il numero di pip in valuta?

cioè se il profitto è in unità di valuta, allora 50 pips dovrebbero essere convertiti in unità di valuta... cioè la leva dovrebbe essere presa in considerazione...? 0_о

 

paladino80, il problema non è aprire un ordine... funziona bene... Ho scremato questa parte per chiarire quali variabili del post del 01.05.12 19:15 sono state utilizzate ulteriormente...

il problema è questo (vedi sotto), è un'esecuzione una tantum e per qualche ragione Vol aumenta all'infinito, quindi il Lts aumenta all'infinito... non è chiaro... per favore vedi il post in questione e dimmi cosa c'è di sbagliato...

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