Как заработать деньги. Проект сам себе финансист.
сентябрь 2011
пн вт ср чт пт сб вс
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30
Главная » » »

Пример использования функции OrderSend()

Для того, чтобы рассмотреть в подробностях и показать пример использования функции OrderSend() - возьмем код несложного советника.

По задумке автора, советник должен в определенное время (параметры MyHour и MyMinute) на заранее заданном расстоянии от текущей цены (параметр MyPendingLevel) выставлять два ордера - Sell Stop и Buy Stop. При этом должны выставляться ордера Stop Loss на расстоянии MySL пипсов от цены ордера и Take Profit на расстоянии MyTP пипсов.

   

  //---- input parameters
   extern int       MyPendingLevel=15;
   extern int       MySL=30;
   extern int       MyTP=15;
   extern int       MyHour=19;
   extern int       MyMinute=40;
   extern int       MyLots=1.0;
datetime LastTradeTime; // время последней торговой операции
//+------------------------------------------------------------------+ //| expert initialization function | //+------------------------------------------------------------------+ int init() { //---- // установим время последней торговой операции вчерашним днем LastTradeTime = CurTime()-24*60*60; //---- return(0); } //+------------------------------------------------------------------+ //| expert deinitialization function | //+------------------------------------------------------------------+ int deinit() { //----
//---- return(0); } //+------------------------------------------------------------------+ //| expert start function | //+------------------------------------------------------------------+ int start() { //---- // проверим, не выставляли ли мы ордер уже сегодня // если выставляли - выходим if (TimeDayOfYear(CurTime())==TimeDayOfYear(LastTradeTime)) return(0);
// проверим, не наступило ли время выставить ордер if ((TimeHour(CurTime())==MyHour)&&(TimeMinute(CurTime())==MyMinute)) {// выставим Buy Stop if (OrderSend(Symbol(), OP_BUYSTOP, MyLots, Ask+Point*MyPendingLevel, 0, Ask+Point*MyPendingLevel-Point*MySL, Ask+Point*MyPendingLevel+Point*MyTP)!=-1) LastTradeTime = CurTime(); // ордер не выставлен else return(0);
// обязательная пауза в 10 секунд Sleep(10000);
// обновим текущий Bid и Ask RefreshRates();
// выставим Sell Stop if (OrderSend(Symbol(), OP_SELLSTOP, MyLots, Bid-Point*MyPendingLevel, 0, Bid-Point*MyPendingLevel+Point*MySL, Bid-Point*MyPendingLevel-Point*MyTP)!=-1) LastTradeTime = CurTime(); // ордер не выставлен else return(0);} //---- return(0);} //+------------------------------------------------------------------+

Анализ кода и разбор функций советника:

Прежде всего этот эксперт имеет несколько параметров:

   
        extern int       MyPendingLevel=15;
        extern int       MySL=30;
        extern int       MyTP=15;
        extern int       MyHour=19;
        extern int       MyMinute=40;
        extern int       MyLots=1.0;

Эти параметры имеют следующих смысл:

  • MyPendingLevel - расстояние в пипсах от текущей цены, на котором выставляется отложенный ордер;
  • MySL и MyTP - Stop Loss и Tale Profit в пипсах от цены отложенного ордера;
  • MyHour и MyMinute - час и минута, когда выставляет отложенный ордер;
  • MyLots - размер лота отложенного ордера.

Напомню, что о том, как описать в коде параметры эксперта, я рассказывал в выпуске "Внешние переменные".

В реальности может возникнуть ситуация, когда на баре MyHour:MyMinute может быть несколько тиков, поэтому чтобы избежать выставления отложенных ордеров на каждом тике, мы завели глобальную переменную LastTradeTime:

  datetime LastTradeTime; // время последней торговой операции

Этой переменной мы присваиваем в качестве начального значения вчерашнюю дату при инициализации эксперта - в функции init():

  

  //+------------------------------------------------------------------+
  //| expert initialization function                          |
  //+------------------------------------------------------------------+
  
int init()
    {
  //----
     // установим время последней торговой операции вчерашним днем 
     LastTradeTime = CurTime()-24*60*60;   
 //----
     return(0);
  }

На каждом тике вызывается функция start(), в которой мы сначала проверяем, не выставляли ли мы уже сегодня отложенные ордера:

   // проверим, не выставляли ли мы ордер уже сегодня
   // если выставляли - выходим
   if (TimeDayOfYear(CurTime())==TimeDayOfYear(LastTradeTime)) 
         return(0);

Здесь используется неизвестная нам пока функция TimeDayOfYear():

   int TimeDayOfYear( datetime date )

Эта функция возвращает порядковый номер дня (с начала года): 1 - 1 января, ... , 365 или 366 - 31 декабря.

Если же порядковый номер дня последней торговой операции - TimeDayOfYear(LastTradeTime) - равен порядковому дню текущего времени - TimeDayOfYear(CurTime()), - значит мы уже сегодня ордера выставляли, поэтому выходим из эксперта: return(0).

Теперь проверим, не наступило ли время выставить отложенный ордер:

   

  // проверим, не наступило ли время выставить ордер
   if ((TimeHour(CurTime())==MyHour)&&(TimeMinute(CurTime())==MyMinute))
     {
       ...
     }

Расскажу о двух незнакомых функциях в этом участке кода:

  • int TimeHour(datetime time) - возвращает час для времени time: 0..23;
  • int TimeMinute(datetime time) - возвращает минуту для времени time: 0..59.

Если уже пора выставить отложенный ордер, то сначала с помощью функции OrderSend() размещаем ордер Buy Stop.

Потом выжидаем паузу в 10 секунд с помощью функции Sleep():

   void Sleep(int milliseconds)

Эта функция делает паузу в работе эксперта на milliseconds милисекунд (1 секунда = 1000 милисекунд).

За эти 10 секунд текущий бид и аск могли измениться, поэтому мы обновляем их с помощью функции RefreshRates().

Далее мы выставляем отложенный ордер Sell Stop.

Вот мы и дошли до конца нашего эксперта. Хочется обратить ваше внимание, что этот эксперт может пропустить момент, когда надо было выставить отложенный ордер, если в этом баре не было котировок и функция start() не вызывалась. Полагаем, что у Вас уже достаточно собственных знаний, чтобы самостоятельно подправить этот недостаток эксперта.

В следующем выпуске мы расскажем о функции OrderModify().

Хомячковый рай. Уйти и потеряться:

Комментарии к этой заметке больше не принимаются.




Есть что сказать? Не стесняйтесь!






Последние статьи:

Выгодные «исламские счета» для трейдеров Форекс Выгодные «исламские счета» для трейдеров Форекс Таким образом, вне зависимости от стиля работы стоит использовать «исламские счета» и сотрудничать с компаниями, которые не берут с трейдеров swap-комиссии. ..
2014-09-29
Стоит ли покупать чужие торговые сигналы и прогнозы? Стоит ли покупать чужие торговые сигналы и прогнозы? И все же основным нашим советом станет отказ от покупки торговых сигналов и прогнозов. Куда лучше научиться анализировать валютный рынок и думать всегда только своей головой. ..
2015-02-12

Видео по теме:




В мире больших денег

  • Самые богатые люди
    планеты. Ежегодные рейтинги FORBS. Истории успеха признаных финансовых гуру
  • Самые дорогие вещи:
    Часы, автомобили, ноутбуки стоимотью в десятки и сотни тысяч долларов. Рубрика "Чтоб я так жил"
  • Денежные прогнозы
    Что покупать и что продавать? Периодические прогнозы цен на иностранные валюты, акции крупнейших компаний и драгоценные металлы

ВКонтакте с деньгами

УГОЛОК АДМИНИСТРАТОРА