Ваши вопросы по языку MQL4

Sergey Kovalyov

Элитный участник
Как померять проскальзывание. Debug меняем на Print.

Переменные

bool close = false;
int ticks, ticket, type;
double slippage, price;

надо описать.

symb меняем на Symbol()

PHP:
Expand Collapse Copy
ticks = GetTickCount();
if (type == OP_BUY) {
        RefreshRates();
        price = Ask;
        Debug("going to BUY: " + DoubleToStr(lot, 2) + "  ask: " + DoubleToStr(price, Digits));
        ticket = OrderSend(symb, OP_BUY, lot, Ask, 0, 0, 0);
} else if (type == OP_SELL) {
        RefreshRates();
        price = Bid;
        Debug("going to SELL: " + DoubleToStr(lot, 2) + "  bid: " + DoubleToStr(price, Digits));
        ticket = OrderSend(symb, OP_SELL, lot, Bid, 0, 0, 0);
}
if (ticket != 0) { 
        OrderSelect(ticket, SELECT_BY_TICKET);
        if (close) {
                slippage = price - OrderClosePrice();
                if (type == OP_BUY) slippage = -slippage;
        } else {
                slippage = price - OrderOpenPrice();
                if (type == OP_SELL) slippage = -slippage;
        }       
        Debug(""
                + "ticket #" + ticket
                + "  ms: " + (GetTickCount() - ticks)
                + "  slip: " + DoubleToStr(slippage / Point, 0)
                + "  cmnt: " + OrderComment()
        );      
}
 
Последнее редактирование:

mnem0n1k

Местный житель
Как померять проскальзывание.
Debug меняем на Print. Переменные ticks, price, ticket, slippage надо описать.
symb меняем на Symbol()

PHP:
Expand Collapse Copy
ticks = GetTickCount();
if (type == OP_BUY) {
        RefreshRates();
        price = Ask;
        Debug("going to BUY: " + DoubleToStr(lot, 2) + "  ask: " + DoubleToStr(price, Digits));
        ticket = OrderSend(symb, OP_BUY, lot, Ask, 0, 0, 0);
} else if (type == OP_SELL) {
        RefreshRates();
        price = Bid;
        Debug("going to SELL: " + DoubleToStr(lot, 2) + "  bid: " + DoubleToStr(price, Digits));
        ticket = OrderSend(symb, OP_SELL, lot, Bid, 0, 0, 0);
}
if (ticket != 0) { 
        OrderSelect(ticket, SELECT_BY_TICKET);
        if (close) {
                slippage = price - OrderClosePrice();
                if (type == OP_BUY) slippage = -slippage;
        } else {
                slippage = price - OrderOpenPrice();
                if (type == OP_SELL) slippage = -slippage;
        }       
        Debug(""
                + "ticket #" + ticket
                + "  ms: " + (GetTickCount() - ticks)
                + "  slip: " + DoubleToStr(slippage / Point, 0)
                + "  cmnt: " + OrderComment()
        );      
}

В каком смысле описать? Ты пойми, я вобще 0 в этом деле.:))
Как юзер - очень оперативный и понятливый, но как "описывалищик" - ноль.:)
Для Альпари ECN что надо вписывать и куда? Или это каждый раз, как приспичит, надо будет что-то менять?
 

Sergey Kovalyov

Элитный участник
Ну, переменные, перед тем как использовать, надо создать. Создание переменных называется "описание". В начало кода добавь строчки как там написано. int бла-бла-бла. Не, один раз прописать. Оно от брокера не зависит.

По остальному... даже не знаю как тебе объяснить... Давай, ты найдешь кусок, где у тебя в коде OrderSend (или несколько кусков, если их несколько_ и по 10 строчек сверху и снизу от него скопируешь, я попробую поменять, ты его туда втулишь обратно уже поменяный, и посмотрим, чо получится. =)
 

mnem0n1k

Местный житель
Ну, переменные, перед тем как использовать, надо создать. Создание переменных называется "описание". В начало кода добавь строчки как там написано. int бла-бла-бла. Не, один раз прописать. Оно от брокера не зависит.

По остальному... даже не знаю как тебе объяснить... Давай, ты найдешь кусок, где у тебя в коде OrderSend (или несколько кусков, если их несколько_ и по 10 строчек сверху и снизу от него скопируешь, я попробую поменять, ты его туда втулишь обратно уже поменяный, и посмотрим, чо получится. =)

Не, уже сам (не я:)).. разбудил гениального программиста, который всем этим заправляет. Спасибо за помощь.:)
 

Алекc1234

Местный житель
У меня такая проблема. ДЦ изменил время терминала с GMT+1 на GMT+2. А мой сов настроен на определённое время и при тестировании он видит в терминале до сегодняшнего дня прежнее время(GMT+1) а уже с сегодняшнего время другое. Так вот помогите в коде написать: если до 27 января 2013 года, то...., и - если после 27 января 2013 года, то...
 

Ugar

Гуру форума
У меня такая проблема. ДЦ изменил время терминала с GMT+1 на GMT+2. А мой сов настроен на определённое время и при тестировании он видит в терминале до сегодняшнего дня прежнее время(GMT+1) а уже с сегодняшнего время другое. Так вот помогите в коде написать: если до 27 января 2013 года, то...., и - если после 27 января 2013 года, то...
Код:
Expand Collapse Copy
//Задать дату
   string data="2013.01.27";
   //Преобразовать в datetime
   datetime data_=StrToTime(data);
   //Текущие дата и время
   datetime cur=TimeCurrent();
   //До заданной даты
   if(cur<data_)
      {
      //До заданной даты, то...
      }
   //После или равно заданной даты 00:00:00
   else
      {
      //После или равно заданной даты 00:00:00, то...
      }
 

AlexeyVik

Программист mql4 mql5
У меня такая проблема. ДЦ изменил время терминала с GMT+1 на GMT+2. А мой сов настроен на определённое время и при тестировании он видит в терминале до сегодняшнего дня прежнее время(GMT+1) а уже с сегодняшнего время другое. Так вот помогите в коде написать: если до 27 января 2013 года, то...., и - если после 27 января 2013 года, то...
if(TimeCurrent() <= StrToTime("2013.1.27");// если до 27 января 2013 года, то...
else if(TimeCurrent() > StrToTime("2013.1.27");//если после 27 января 2013 года, то...
 

hoz

Активный участник
У всем известного Юрия Дзюбана есть функция обычного траала. Свои функции у меня работаю великолепно, но мне всегда интересно узнать новые подходы. Решил я понять его логику. Вот содержимое кода, функция, какие глобальные переменные и что писать в старте:

PHP:
Expand Collapse Copy
extern   int      iTicket;             // уникальный номер (тикет) открытой позиции
extern   int      iTrldistance = 40;   // расстояние от текущего курса (пунктов), на котором включается трейлинг, пунктов
extern   int      iTrlstep = 10;       // "шаг" изменения стоплосса (пунктов) (не меньше 1)

//+------------------------------------------------------------------+
//| ТРЕЙЛИНГ СТАНДАРТНЫЙ-СТУПЕНЧАСТЫЙ                                |
//| Советнику передаётся тикет позиции, расстояние от курса открытия,|
//| на котором трейлинг запускается (пунктов) и "шаг", с которым он  |
//| переносится (пунктов)                                            |
//| Пример: при +30 стоп на +10, при +40 - стоп на +20 и т.д.        |
//+------------------------------------------------------------------+

//+------------------------------------------------------------------+
//| expert initialization function                                   |
//+------------------------------------------------------------------+
int init()
  {    
   return(0);
  }
  
//+------------------------------------------------------------------+
//| expert deinitialization function                                 |
//+------------------------------------------------------------------+
int deinit()
  {
   return(0);
  }
  
//+------------------------------------------------------------------+
//| expert start function                                            |
//+------------------------------------------------------------------+
int start()
  {
   TrailingStairs(iTicket,iTrldistance,iTrlstep);
   return(0);
  }
//+------------------------------------------------------------------+

void TrailingStairs(int ticket,int trldistance,int trlstep)
   { 
   
   double nextstair; // ближайшее значение курса, при котором будем менять стоплосс

   // проверяем переданные значения
   if ((trldistance<MarketInfo(Symbol(),MODE_STOPLEVEL)) || (trlstep<1) || (trldistance<trlstep) || (ticket==0) || (!OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)))
      {
      Print("Трейлинг функцией TrailingStairs() невозможен из-за некорректности значений переданных ей аргументов.");
      return(0);
      } 
   
   // если длинная позиция (OP_BUY)
   if (OrderType()==OP_BUY)
      {
      // расчитываем, при каком значении курса следует скорректировать стоплосс
      // если стоплосс ниже открытия или равен 0 (не выставлен), то ближайший уровень = курс открытия + trldistance + спрэд
      if ((OrderStopLoss()==0) || (OrderStopLoss()<OrderOpenPrice()))
      nextstair = OrderOpenPrice() + trldistance*Point;
         
      // иначе ближайший уровень = текущий стоплосс + trldistance + trlstep + спрэд
      else
      nextstair = OrderStopLoss() + trldistance*Point;

      // если текущий курс (Bid) >= nextstair и новый стоплосс точно лучше текущего, корректируем последний
      if (Bid>=nextstair)
         {
         if ((OrderStopLoss()==0) || (OrderStopLoss()<OrderOpenPrice()) && (OrderOpenPrice() + trlstep*Point<Bid-MarketInfo(Symbol(),MODE_STOPLEVEL)*Point)) 
            {
            if (!OrderModify(ticket,OrderOpenPrice(),OrderOpenPrice() + trlstep*Point,OrderTakeProfit(),OrderExpiration()))
            Print("Не удалось модифицировать стоплосс ордера №",OrderTicket(),". Ошибка: ",GetLastError());
            }
         }
      else
         {
         if (!OrderModify(ticket,OrderOpenPrice(),OrderStopLoss() + trlstep*Point,OrderTakeProfit(),OrderExpiration()))
         Print("Не удалось модифицировать стоплосс ордера №",OrderTicket(),". Ошибка: ",GetLastError());
         }
      }
      
   // если короткая позиция (OP_SELL)
   if (OrderType()==OP_SELL)
      { 
      // расчитываем, при каком значении курса следует скорректировать стоплосс
      // если стоплосс ниже открытия или равен 0 (не выставлен), то ближайший уровень = курс открытия + trldistance + спрэд
      if ((OrderStopLoss()==0) || (OrderStopLoss()>OrderOpenPrice()))
      nextstair = OrderOpenPrice() - (trldistance + MarketInfo(Symbol(),MODE_SPREAD))*Point;
      
      // иначе ближайший уровень = текущий стоплосс + trldistance + trlstep + спрэд
      else
      nextstair = OrderStopLoss() - (trldistance + MarketInfo(Symbol(),MODE_SPREAD))*Point;
       
      // если текущий курс (Аск) >= nextstair и новый стоплосс точно лучше текущего, корректируем последний
      if (Ask<=nextstair)
         {
         if ((OrderStopLoss()==0) || (OrderStopLoss()>OrderOpenPrice()) && (OrderOpenPrice() - (trlstep + MarketInfo(Symbol(),MODE_SPREAD))*Point>Ask+MarketInfo(Symbol(),MODE_STOPLEVEL)*Point))
            {
            if (!OrderModify(ticket,OrderOpenPrice(),OrderOpenPrice() - (trlstep + MarketInfo(Symbol(),MODE_SPREAD))*Point,OrderTakeProfit(),OrderExpiration()))
            Print("Не удалось модифицировать стоплосс ордера №",OrderTicket(),". Ошибка: ",GetLastError());
            }
         }
      else
         {
         if (!OrderModify(ticket,OrderOpenPrice(),OrderStopLoss()- (trlstep + MarketInfo(Symbol(),MODE_SPREAD))*Point,OrderTakeProfit(),OrderExpiration()))
         Print("Не удалось модифицировать стоплосс ордера №",OrderTicket(),". Ошибка: ",GetLastError());
         }
      }      
   }


У меня его подход сразу вызвал трудности. Во-первых, почему тикет в глобальных и, к тому же внешних!? Его же нужно получать перебором ордеров через цикл... Как иначе?
Вызов функции тоже странный:

PHP:
Expand Collapse Copy
TrailingStairs(iTicket,iTrldistance,iTrlstep);


Если у меня открыто 40 ордеров, например, в данный момент, откуда функция узнает какой ордер ей использовать?


По-моему тут логично работать через цикл, типа того как я сделал. В старт я добавил вот такой код:

PHP:
Expand Collapse Copy
for (g = OrdersTotal() - 1; g >= 0; g--)
   {
       if (!OrderSelect(g,SELECT_BY_POS)) continue;
        if (i_magic != -1) if (OrderMagicNumber() != i_magic) continue;
        if (OrderSymbol() != Symbol()) continue;
       {
           ticket = OrderTicket();
           TrailingStairs(ticket, iTrldistance, iTrlstep);
       }
   }


Что здесь не так вообще?
 

Sergey Kovalyov

Элитный участник
А где в цикле присвоение номера тикета переменной и/или передача его в тралл?

Вместо ticket попробуйте поставить OrderTicket()
Немного криво, но должно сработать, по идее. =)
 

hoz

Активный участник
А где в цикле присвоение номера тикета переменной и/или передача его в тралл?

Вместо ticket попробуйте поставить OrderTicket()
Немного криво, но должно сработать, по идее. =)

Как это где?

Цикл:

PHP:
Expand Collapse Copy
 for (g = OrdersTotal() - 1; g >= 0; g--)
   {
       if (!OrderSelect(g,SELECT_BY_POS)) continue;
        if (i_magic != -1) if (OrderMagicNumber() != i_magic) continue;
        if (OrderSymbol() != Symbol()) continue;
       {
           ticket = OrderTicket();
           TrailingStairs(ticket, iTrldistance, iTrlstep);
       }
   }


Присвоение:

PHP:
Expand Collapse Copy
   ticket = OrderTicket();
 

hoz

Активный участник
Когда я писал вопрос, этого не было. Или меня проглючило. Наверное, проглючило.

Так работает или как? В чем проблема-то?

Давай по порядку.. Первый вопрос такой:

" У меня его подход сразу вызвал трудности. Во-первых, почему тикет в глобальных и, к тому же внешних!? "
 

Sergey Kovalyov

Элитный участник
Ну, чтобы можно было ручками задать номер тикета при запуске. Если ты решил, что тебе надо тралить все и автоматом, то выкинь и все. =)
 

hoz

Активный участник
Ну, чтобы можно было ручками задать номер тикета при запуске. Если ты решил, что тебе надо тралить все и автоматом, то выкинь и все. =)

И как ты себе это представляешь? Торговать всегда тока одним ордером? Это абсурдно.
 

Sergey Kovalyov

Элитный участник
Автор сделал функцию так, что ты ее запускаешь и ручками вбиваешь номер тикета (extern это значит выскочит окошко такое, где параметры советника указываеются). Тебе этого не надо. Убери extern iTicket, поставь свой цикл в start вместо просто вызова трала, и все будет ок. В чем вопрос/проблема?
 

hoz

Активный участник
Проблема в том, что я так и сделал. Но ошибка пошло 130. Близкие стопы. Значит косяк получается в его функции...
 

hoz

Активный участник
Ну брокер Альпари для теста. Вот что тестер выдаёт:

PHP:
Expand Collapse Copy
2013.01.30 14:02:03	2011.01.12 13:28  Phillip_Nel's_TS_for_M5 EURUSD,H1: Не удалось модифицировать стоплосс ордера №1. Ошибка: 130
2013.01.30 14:02:03	2011.01.12 13:28  Phillip_Nel's_TS_for_M5 EURUSD,H1: OrderModify error 130
2013.01.30 14:02:03	2011.01.12 13:28  Phillip_Nel's_TS_for_M5 EURUSD,H1: OrderStopLoss() = 1.2969
2013.01.30 14:02:03	2011.01.12 13:28  Phillip_Nel's_TS_for_M5 EURUSD,H1: nextstair = 1.3059
2013.01.30 14:02:03	2011.01.12 13:28  Phillip_Nel's_TS_for_M5 EURUSD,H1: Ask = 1.2972 Bid = 1.297
2013.01.30 14:02:03	2011.01.12 13:28  Phillip_Nel's_TS_for_M5 EURUSD,H1: Не удалось модифицировать стоплосс ордера №1. Ошибка: 130
2013.01.30 14:02:03	2011.01.12 13:28  Phillip_Nel's_TS_for_M5 EURUSD,H1: OrderModify error 130
2013.01.30 14:02:03	2011.01.12 13:28  Phillip_Nel's_TS_for_M5 EURUSD,H1: OrderStopLoss() = 1.2969
2013.01.30 14:02:03	2011.01.12 13:28  Phillip_Nel's_TS_for_M5 EURUSD,H1: nextstair = 1.3059
2013.01.30 14:02:03	2011.01.12 13:28  Phillip_Nel's_TS_for_M5 EURUSD,H1: Ask = 1.2972 Bid = 1.2971
2013.01.30 14:02:03	2011.01.12 13:28  Phillip_Nel's_TS_for_M5 EURUSD,H1: Не удалось модифицировать стоплосс ордера №1. Ошибка: 130
2013.01.30 14:02:03	2011.01.12 13:28  Phillip_Nel's_TS_for_M5 EURUSD,H1: OrderModify error 130
2013.01.30 14:02:03	2011.01.12 13:28  Phillip_Nel's_TS_for_M5 EURUSD,H1: OrderStopLoss() = 1.2969
2013.01.30 14:02:03	2011.01.12 13:28  Phillip_Nel's_TS_for_M5 EURUSD,H1: nextstair = 1.3059

Нормальный стоп в принципе. Абы что. Причём тут близкие стоп...
 
Верх