вопрос по времени модификации ордера

 

Господа программисты!

Помогите решить один (может быть для вас простой) вопрос.

Вот открыт ордер приходит пора модифицировать его ну дапустим стоп лосс если все условия выполнены.

Но как сделать или добавить время в условия дапустим через пять минут чтобы работала функция модификации.

Покажите на примере

а то уже два дня мучаюсь весь форум облазил

Sleep(30000); ставил

Time[0]

TimeMinute(TimeCurrent());

не чего не помагает

на тестере модифигация идет на секунду по несколько раз, вить забанят же

я конечно извиняюсь если тема была но я нечего не нашол

и извиняюсь что вопрос может показатся тупым (опыт mql4 всего 2 недели)

С Уважением,

Евгений

 

Смотрите время открытия ордера, есть стандартная ф-ция datetime "OrderOpenTime( ) ", затем текущее время, из текщего вычитаем полученое OrderOpenTime, если разница равна 300 или более секунд, модифицируем ордер. Это для первой модификации. Вводим дополнительную переменную в цикле модификации ордера, это будет счетчик, при каждой модификации увеличивайте его на 1. Это будет ваш коэффициент, далее просто умножаете его на 300 и сравниваете со временем открытия ордера. Это для модификации раз в 5 минут, а там смотрите уже как вам надо. Написать это не сложно, просто подумайте и воспользуйтесь справкой в MetaEditor'е.

 

На мой взгляд, привязывать модификацию ко времени неправильно в принципе.

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

Например, если разница между ценой и стопом превышает дистанцию преследования (например, 20п) на 3п, то выполнять модифи так, чтобы разница между ценой и стопом стала равно 20п. При этом, нужно учитывать, что собственно модифи должно происходить "к 20", а не "несколько по 3".

Например:

Исходная екущая цена Bid=1.5100. SL = 1.5080.

Вариант 1.

a) Bid = 1.5101, >> SL = 1.5080

b) Bid = 1.5102, >> SL = 1.5080

c) Bid = 1.5103, >> SL = 1.5080

d) Bid = 1.5104, >> SL = 1.5084 - здесь разница между ценой и SL достигла 24, т.е. больше 20 более, чем на 3, подтягиваем SL так, чтоб дистанция сохранялась 20

Вариант 2.

а) Bid = 1.5117, >> SL = 1.5097 - цена "рванула" сразу на 17п, больше, чем на 3, подтягиваем SL так, чтоб дистанция сохранялась 20 (а не модифицируем 6 раз подряд по 3п)

--

Этот принцип реализован в приложении AutoGraf 4, инструменты 1,2,3,9,10,11, только ещё параметры (те, что в примере 20 и 3) могут настраиваться. Например, инструмент 1 (подтяжка вверх): http://autograf.dp.ua/Pages/2/24/2401.htm

 

простите а можно на пальцах показать как че делать мне просто надо привязать время к этому коду

void Modify()
{

{
if (TrailingStop<0) return;
for (int i=0; i<OrdersTotal(); i++)
{
if (OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==false) break;
if (OrderSymbol()!=Symbol() || OrderMagicNumber()!=magik) continue;
if (OrderType()==OP_BUY)
{
if(Bid-OrderOpenPrice()>Point*TrailingStop)
{
if(OrderStopLoss()<Bid-Point*TrailingStop)
{
OrderModify(OrderTicket(),OrderOpenPrice(),Bid-Point*TrailingStop,0,0,Green);
return(0);
}
}
}
if (OrderType()==OP_SELL)
{
if((OrderOpenPrice()-Ask)>(Point*TrailingStop))
{
if((OrderStopLoss()>(Ask+Point*TrailingStop)) || (OrderStopLoss()==0))
{
OrderModify(OrderTicket(),OrderOpenPrice(),Ask+Point*TrailingStop,0,0,Red);
return(0);
}
}
}
}
}
}

 
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
void Modify(int MinProfit,int TrailingStep,int TrailingStop)
{ 
  int cnt = OrdersTotal();
  for (int i=0; i<cnt; i++) {
    if (!(OrderSelect(i, SELECT_BY_POS, MODE_TRADES))) continue;

    if (OrderSymbol() != Symbol()) continue;
    if (OrderType() == OP_BUY ) {
      if (Bid-OrderOpenPrice() > MinProfit*Point) {
        if (OrderStopLoss() < Bid-(TrailingStop+TrailingStep-1)*Point) {
          OrderModify(OrderTicket(), OrderOpenPrice(), Bid-TrailingStop*Point, 0, 0, Blue);
        }
      }
    }
    
    if (OrderType() == OP_SELL ) {
      if (OrderOpenPrice()-Ask > MinProfit*Point) {
        if (OrderStopLoss() > Ask+(TrailingStop+TrailingStep-1)*Point || OrderStopLoss() == 0) {
          OrderModify(OrderTicket(), OrderOpenPrice(), Ask+TrailingStop*Point, 0, 0, Blue);
        }
      }
    }
  }return(0); 
}
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Вызвать вот так

Modify(10,20,Tral);

Если нужно чтобы сработал через время добавь  какойнибудь таймер

extern int step = 20;
int prevtime = 0;

bool Timer(int period)
     {
     if(TimeCurrent()-prevtime>step*period*60){
     prevtime = TimeCurrent();
     return(true);
     }
    return(false);     
}

void start()
    {

     if(Timer(Period())){
                Modify(10,20,Tral);
               }  

         }

 

 
amicus писал(а) >>

Вызвать вот так

Спасибо огромное вы мне здорово помогли

 
amicus писал(а) >>

Вызвать вот так

Если нужно чтобы сработал через время добавь какойнибудь таймер

Что-то и логин, и аватар сменился. И вроде не банили.

 
Виктор,ник скайвокер какойто несчастливый :)
 

В представленной функции void Modify() не хватает проверки StopLevel и FreezeLevel, а таже проверки ошибок, возвращаемых сервером. В простом варианте можно без этого и обойтись. Но если для себя и для реала, то лучше всё делать по-хорошему.

 
Согласен.
Причина обращения: