[АРХИВ!] Любой вопрос новичка, чтоб не захламлять форум. Профи, не проходите мимо. Без вас никуда - 4. - страница 97

 
 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;
      }
не могу понять где ошибка, подскажите, пожалуйста. Говорит "нехватает денег на покупку Lts=1.#INF"
 

А проверить, депозит на достаточность ? https://docs.mql4.com/ru/constants/marketinfo

А проверить лот на выхлопе ?

 

В этом вся и проблема... Количество лотов растет до бесконечности, т.е. повышение объема зациклено, а по коду получается разовое увеличение...

после следует чтобы было понятно см.ниже. и следовательно тоже самое с 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;                           // Повторная попытка

это так называемое "разовое" ?

кэп, это же очевидно, тут цикл.

 
sergeev, видимо Вы сами не очень соображаете.. это цикл если выпала ошибка при открытии, а не на увеличение кол-ва лотов.
 

Здравствуйте!

Что-то не могу найти ответа на такой вопрос:

если отложенный ордер исполняется его тип по-прежнему остается типом отложенного ордера, или меняется на OP_BUY или OP_SELL?

 
oDin48:

В этом вся и проблема... Количество лотов растет до бесконечности, т.е. повышение объема зациклено, а по коду получается разовое увеличение...

после следует чтобы было понятно см.ниже. и следовательно тоже самое с Sell

Попробуйте
if (Fun_Error(GetLastError())==0)   // Нет ошибки
break; 
Если будет ошибка, то просто на новом тике опять будет пробовать открыть позицию. Кстати мне тут на этом форуме (стр. 90-91) объяснили, что желательно оператором && (и) в if не пользоваться.
 
gogent:

если отложенный ордер исполняется его тип по-прежнему остается типом отложенного ордера, или меняется на OP_BUY или OP_SELL?

меняется конечно.
 

кто нибудь знает, как можно перевести количество пунктов в валюту?

т.е. если профит в единицах валюты, то надо 50 пунктов перевести в эти единицы.. учитывать плечё надо еще наверное?.. 0_о

 

paladin80, проблема не в открытии ордера... это работает прекрасно... я скинул эту часть чтобы было понятно, какие переменные из поста от 01.05.12 19:15, где в дальнейшем используются...

проблема в этом (см.ниже), это разовое исполнение, а почему-то Vol увеличивается до бесконечности, следовательно до бесконечности увеличивается Lts... это не понятно... прошу посмотреть пост о котором идет речь и сказать, что не так...

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