Для того, чтобы рассмотреть в подробностях и показать пример использования функции 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; Эти параметры имеют следующих смысл:
Напомню, что о том, как описать в коде параметры эксперта, я рассказывал в выпуске "Внешние переменные". В реальности может возникнуть ситуация, когда на баре 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)) { ... } Расскажу о двух незнакомых функциях в этом участке кода:
Если уже пора выставить отложенный ордер, то сначала с помощью функции 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 Видео по теме: В мире больших денег
ВКонтакте с деньгамиУГОЛОК АДМИНИСТРАТОРА |