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

 

Добрый вечер! Подскажите, как понять 

размер маржи, необходимой для указанного типа ордера на текущем счете и при текущем рыночном окружении без учета текущих отложенных ордеров и открытых позиций. 

 

Може те ли приблизительно указать существующую функцию? 

 

 Ещё Стал вместо лота использовать такую функцию

double     Lott  ( double     Lot ){
     if ( risk!=0)  Lot=AccountFreeMargin()*risk/10000 ; return (Lot);}  

 Сплош и рядом пишет OrderSend error 131  - неправильный обьём.  При начальном депо 10000 начальный лот 1. Однако, что-то не фурычит..

 

Какое-то время пытаюсь переделать блок закрытие buy позиции чтобы закрыть только две последние buy позиции, но не получается. Можете подсказать как переделать блок?

void Close_2buy()
{
   bool   result;
  double  close_price;
  int    cmd,error;
  bool close;

      for (int f=OrdersTotal()-1; f>=0; f--) // 
      {
         OrderSelect(f, SELECT_BY_POS);
         if (OrderSymbol()==Symbol() &&(OrderMagicNumber()==magic ) 
         && (OrderType() == OP_BUY )) 
         {
            close = False;
            {
               close_price = MarketInfo(OrderSymbol(), MODE_BID);
               close = True;
            }
               
            if (close) 
            {
               result=OrderClose(OrderTicket(), OrderLots(), close_price, 0, CLR_NONE);
               if(result!=TRUE)
               {error=GetLastError();Print("LastError = ", error);}
            }
            
         }
      }
}
 
Dimka-novitsek:

 Ещё Стал вместо лота использовать такую функцию

 Сплош и рядом пишет OrderSend error 131  - неправильный обьём.  При начальном депо 10000 начальный лот 1. Однако, что-то не фурычит..


Я использую это. подправьте под себя и попробуйте.(поменять AccountBalance() на AccountFreeMargin(),поставить свою перем.  LotsDigits)
//+------------------------------------------------------------------+
//|                                                         0000.mq4 |
//+------------------------------------------------------------------+
#property copyright ""
#property link      ""
////////////////////////////////////////////////////////////////////////|
extern int     Method         =1;      // Метод: 0-FixedLots, 1-часть //|
                                       //(Risk) от свободных средств  //|
                                       // нормированных по значению   //|
                                       // MeansStep(например Risk=    //|
                                       // 0.01,MeansStep=1000,если    //|
                                       // средств меньше 2000,лот     //|
                                       // равен 0.01,если средств     //|
                                       // стало 2000 или более - 0.02 //|
                                       // лота, 3000 или более - 0.03 //|
                                       // лота и т.д.).               //|
                                                                      //|
extern double  LOTS           =0.01;   // Количество лотов при        //|
                                       // Method=0.                   //|
                                                                      //|
extern double  Risk           =0.01;   // Риск. Часть от средств при  //|
                                       // FixedLot=false.             //|
                                                                      //|
extern double  MeansStep      =100.0;  // Шаг средств. Используется   //|
                                       // при Method=1.               //|     
////////////////////////////////////////////////////////////////////////|
//+------------------------------------------------------------------+//|
//|  Определяем "свой" минимальный размер или шаг лота на момент     |//|
//|  начала цикла в зависимости от размера баланса и установленного  |//|
//|  риска.                                                          |//|
//+------------------------------------------------------------------+//|
////////////////////////////////////////////////////////////////////////|
double fGetLotsSimple()                                               //|
   {                                                                  //|
   double LOTSTEP,lot;                                                //|
   double Means;                                                      //|
   switch (Method)                                                    //|
      {                                                               //|
      case 0:                                                         //|
         lot=LOTS;                                                    //|
      break;                                                          //|
      case 1:                                                         //|
         Means=AccountBalance();                                      //|
         if(Means<MeansStep)Means=MeansStep;                          //|
         lot=(MeansStep*MathFloor(Means/MeansStep))/MeansStep*Risk;   //|
      break;                                                          //|
      default:lot=LOTS;                                               //|
   }                                                                  //|
   if(lot<1.0/MathPow(10,LotsDigits))lot=1.0/MathPow(10,LotsDigits);  //|
   LOTSTEP=MarketInfo(Symbol(),MODE_LOTSTEP);                         //|
   lot=MathFloor(lot/LOTSTEP)*LOTSTEP;                                //|
   lot=NormalizeDouble(lot,LotsDigits);                               //|
   if(lot>AccountFreeMargin())lot=-1;                                 //|
   return(lot);                                                       //|
}                                                                     //|
////////////////////////////////////////////////////////////////////////|
)
 

Подскажите что может быть не правильно в этом коде? Это подобие трейлингстопа, но при тестировании выдаёт ошибку 1, при модификации. Почему не модифицируется ордер?

При чём когда исправлял эту ошибку (пока неудачно), при компиляции стало возвращать ошибку из основного кода эксперта в функцию print, пишет что не хватает кавычек, при чём всё там поставлено верно, и что бы исправить эту ошибку приходиться убирать и ставить заново кавычку..

 

bool trailingstop()
   {
   if ((OrderMagicNumber()==11111)==true)
      {
      Print("Ведём позицию Buy");
      while(OrderCloseTime()==0)
         {
         if ((Bid-OrderStopLoss())>(StopLevel*Point))
            {
            if (OrderModify(OrderTicket(),OrderOpenPrice(),ND(Bid-StopLevel*Point),0,0))
               Print("Stop Loss ордера с номером ", OrderTicket(),", и магическим числом ",OrderMagicNumber(),", успешно изменён на ",OrderStopLoss());
            else Print("Не удалось переместить уровень Stop Loss ордера с номером ", OrderTicket(),", и магическим числом ",OrderMagicNumber(),". Ошибка ",GetLastError());
            }
         }
      if (OrderCloseTime()>0)
         {
         Print("Ордер с номером ", OrderTicket(),", и магическим числом ",OrderMagicNumber(),", закрыт по цене ",OrderClosePrice(),", с прибылью/убытком ",OrderProfit());
         return(true);
         }
      }
   else
      {
      if ((OrderMagicNumber()==22222)==true)
         {
         Print("Ведём позицию Sell");
         while(OrderCloseTime()==0)
            {
            if ((OrderStopLoss()-Ask)>(StopLevel*Point))
               {
               if (OrderModify(OrderTicket(),OrderOpenPrice(),ND(Ask+StopLevel*Point),0,0))
                  Print("Stop Loss ордера с номером ", OrderTicket(),", и магическим числом ",OrderMagicNumber(),", успешно изменён на ",OrderStopLoss());
               else Print("Не удалось переместить уровень Stop Loss ордера с номером ", OrderTicket(),", и магическим числом ",OrderMagicNumber(),". Ошибка ",GetLastError());
               }
            }
         if (OrderCloseTime()>0)
            {
            Print("Ордер с номером ", OrderTicket(),", и магическим числом ",OrderMagicNumber(),", закрыт по цене ",OrderClosePrice(),", с прибылью/убытком ",OrderProfit());
            return(true);
            }
         }
      else return(false);
      }
   }
 
Спасибо!!
 
Ekburg:

Подскажите что может быть не правильно в этом коде? Это подобие трейлингстопа, но при тестировании выдаёт ошибку 1, при модификации. Почему не модифицируется ордер?

При чём когда исправлял эту ошибку (пока неудачно), при компиляции стало возвращать ошибку из основного кода эксперта в функцию print, пишет что не хватает кавычек, при чём всё там поставлено верно, и что бы исправить эту ошибку приходиться убирать и ставить заново кавычку..

 

bool trailingstop()
   {
   if ((OrderMagicNumber()==11111)==true)
      {
      Print("Ведём позицию Buy");
      while(OrderCloseTime()==0)
         {
         if ((Bid-OrderStopLoss())>(StopLevel*Point))
            {
            if (OrderModify(OrderTicket(),OrderOpenPrice(),ND(Bid-StopLevel*Point),0,0))
               Print("Stop Loss ордера с номером ", OrderTicket(),", и магическим числом ",OrderMagicNumber(),", успешно изменён на ",OrderStopLoss());
            else Print("Не удалось переместить уровень Stop Loss ордера с номером ", OrderTicket(),", и магическим числом ",OrderMagicNumber(),". Ошибка ",GetLastError());
            }
         }
      if (OrderCloseTime()>0)
         {
         Print("Ордер с номером ", OrderTicket(),", и магическим числом ",OrderMagicNumber(),", закрыт по цене ",OrderClosePrice(),", с прибылью/убытком ",OrderProfit());
         return(true);
         }
      }
   else
      {
      if ((OrderMagicNumber()==22222)==true)
         {
         Print("Ведём позицию Sell");
         while(OrderCloseTime()==0)
            {
            if ((OrderStopLoss()-Ask)>(StopLevel*Point))
               {
               if (OrderModify(OrderTicket(),OrderOpenPrice(),ND(Ask+StopLevel*Point),0,0))
                  Print("Stop Loss ордера с номером ", OrderTicket(),", и магическим числом ",OrderMagicNumber(),", успешно изменён на ",OrderStopLoss());
               else Print("Не удалось переместить уровень Stop Loss ордера с номером ", OrderTicket(),", и магическим числом ",OrderMagicNumber(),". Ошибка ",GetLastError());
               }
            }
         if (OrderCloseTime()>0)
            {
            Print("Ордер с номером ", OrderTicket(),", и магическим числом ",OrderMagicNumber(),", закрыт по цене ",OrderClosePrice(),", с прибылью/убытком ",OrderProfit());
            return(true);
            }
         }
      else return(false);
      }
   }


Ошибка 1 это не ошибка. это значит, что ордер уже модифицирован . вставьте проверку параметров модификации перед OrderModify() (если стоплосс ордера не равен стоплосс , (ND(Bid-StopLevel*Point)или ND(Ask+StopLevel*Point) ) , тогда OrderModify() , иначе -- return).
 
rigonich:

Ошибка 1 это не ошибка. это значит, что ордер уже модифицирован . вставьте проверку параметров модификации перед OrderModify() (если стоплосс ордера не равен стоплосс , (ND(Bid-StopLevel*Point)или ND(Ask+StopLevel*Point) ) , тогда OrderModify() , иначе -- return).


Дак эта проверка стоит выше:   if ((Bid-OrderStopLoss())>(StopLevel*Point)), или я не правильно вас понял

при чём тестировал на резком движении, там даже визуально, явно видно что стоп лоз ордера и выражения не равны 

 
Usual_Trader:


Навскидку, что вижу, в функции закрытия ордеров нужно выбрать ордер по тикету OrderSelect(Ticket, SELECT_BY_TICKET), количество лотов указать не переменной Lts, она ведь каждый раз пересчитывается, а использовать OrderLots() И еще одно- вы продолжаете работать на 0-м баре, соответственно, критерии наодном баре могут появляться пропадать, ваши ордера могут открываться не там, где хотелось бы. Замените в параметрах индикатора бар 0 на 1, 1 на 2 


 


Огромное спасибо за ответ), но вот критерии снова работают не так как нужно, на скрине это видно (не по всем пересечениям стохастика работают ордера( ), и хотел бы все таки работать на  0 баре, но для этого как я понял нужно доп. условие: после открытия ордера на текущем баре, ничего не делать пока бар не закроется, но как это реализовать не знаю (может через масивы таймсерий???) Подскажите пож.
Файлы:
 
Ekburg:


Дак эта проверка стоит выше:   if ((Bid-OrderStopLoss())>(StopLevel*Point)), или я не правильно вас понял

при чём тестировал на резком движении, там даже визуально, явно видно что стоп лоз ордера и выражения не равны 


Проблема в следующем: так как у вас в этой функции нет OrderSelect(), видимо она используется где то в цикле с перебором ордеров. Если этот цикл организует перебор от нулевого ордера к последнему, то после модификации первого ордера или если на этом тике например был зарыт какой либо ордер при следующем вызове ф-и  OrderSelect() порядок следования ордеров меняется и функция может выбрать для модификации ордер, который уже модифицирован. Поэтому надо проверять не равно ли значение стоплосса ордера тому, которое мы передаем в функцию OrderModify()

if(ND(Bid-StopLevel*Point)==OrderStopLoss())return(true);