Как узнать профит или лось?

 

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

Цена например у нас равна 1.2200.

Прописал я в коде, что если цена достигнет 1.2300 - покупаем с фиксированным стопом и тейком.

Если достигнет 1.2100 - продаем с фиксированным стопом и тейком.

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

Допустим открылась у нас покупка. И сработал тейк. Как это момент узнать? Если сработал ТП - то прекратить торговлю.

Если сработал лось по баю - то в силе у нас остается только продажа. Покупки уже быть не может.

Если продажа закрылась с лосем - прекращаем торговлю, если продажа закрылась с тп - прекращаем торговлю.

Сам факт проверки тикета на тп или лося - понять не могу...

 
//+------------------------------------------------------------------------------+
//| проверим последний сработавший ордер этого советника в истории на СТОПЛОСС   |
//+------------------------------------------------------------------------------+
bool LastHistoryOrderIsStopLoss()
  {      
   i=OrdersHistoryTotal()-1;   
   while (true)
     {        
       if (OrderSelect(i,SELECT_BY_POS,MODE_HISTORY)==true && OrderMagicNumber()==Magic && OrderType()<=1)
       {
         if (OrderStopLoss()==OrderClosePrice())
           return(true);
         else  
           return(false);
       }
       i--;
       if (i<0) return(false);  
     }      
  }
Для определения факта тейкпрофита в историиможете создать аналогичную функцию.
 
MikeZTN:
if (OrderStopLoss()==OrderClosePrice())

А если было проскальзывание при закрытии?
 
if (OrderSelect(...)) {
   if (OrderCloseTime()>0)  { // Закрыт
      if (OrderType()==OP_BUY) {
         if (OrderClosePrice()<=OrderStopLoss()) // закрыт по SL ... else ... закрыт по TP или ещё как :)
      }
      if (OrderType()==OP_SELL) {
         if (OrderClosePrice()>=OrderStopLoss()) // закрыт по SL ... else ... закрыт по TP или ещё как :)
      }
   }
}
 
AlexSTAL:
А если было проскальзывание при закрытии?

Проскальзывание уже учтено сервером, поэтому OrderStopLoss()=OrderClosePrice()
 
MikeZTN:
Для определения факта тейкпрофита в историиможете создать аналогичную функцию.

Хм..спасибо..попробую.
 
А как запретить открытие покупки 2й раз?
 
MikeZTN:

Проскальзывание уже учтено сервером, поэтому OrderStopLoss()=OrderClosePrice()

Это как? Поясните пожалуйста.

Поставили Вы стоп на 1.2240. При закрытии было проскальзывание до 1.2238. У ордера изменится старое значение стоп-лосса что ли?

 
MikeZTN:

   


Вот более правильный вариант, к тому же и более универсальный :

//+-------------------------------------------------------------------------------------------------------+
//| проверим цену закрытия последнего сработавшего ордера в истории на достижение заданного уровня цены   |
//| возвращаемые значения :                                                                               |
//| В случае нахождения - тикет ордера                                                                    |
//| Иначе : -1;                                                                                           |
//+-------------------------------------------------------------------------------------------------------+
int  GetTicketLstHOrdClsdOnPrc(string SYMBL, int OrdType, int MGK, double prc, double err = 0)
{      
    for(int i=OrdersHistoryTotal()-1; i>=0;i--)
    {        
        if(!OrderSelect(i,SELECT_BY_POS,MODE_HISTORY)) break;
        if(OrderSymbol()!=SYMBL  ) continue;
        if(OrderType()  !=OrdType) continue;
        if((MGK!=0)&&(OrderMagicNumber()!=MGK )) continue;
        if(MathAbs(prc-OrderClosePrice())<=err )
            return(OrderTicket());
        else  
            return(-1);
 
    }
    return(-1);      
}//int  GetTicketLstHOrdClsdOnPrc(string SYMBL, int OrdType, int MGK, double prc, double err = 0)

 Удачи.

 
modestuz:
А как запретить открытие покупки 2й раз?


Нужно проверять перед открытием позиции наличие аналогичных рыночных. 

Можно по аналогии с функцией, что я выложил выше.

И вообще, Вы то не первый новичок на форуме. Большинство вопросов, которые Вы задаете и которые у Вас еще возникнут, 100 раз обсуждались на форуме. Можно воспользоваться поиском ;) - помогает.

Удачи. 

 
VladislavVG:


Вот более правильный вариант, к тому же и более универсальный :

Удачи.


int  GetTicketLstHOrdClsdOnPrc(string SYMBL, int OrdType, int MGK, double prc, double err = 0)

prc - это цена? Цена какая?

MGK - это magic number? который указывается в OrderSend при открытии ордера? Его указывать тут?

err - ставить ноль всегда?

SYMBL - это символ

OrdType - Это тип ордера...

Причина обращения: