Я не волшебник, я только учусь!
Есть такая функция Print(), еще есть Comment(), Alert(). При помощи них посмотрите какие значения передаете в OrderSend().
Видимо никаких, потому что советник тупо стоит и ничего не делает в принципе! Возможно я неправильно расположил торговую функцию, либо вызов параметров функции не верен!?
Уважаемые господа!
Черезнесколько лет торговли на форексе, решил таки попробовать написать советника для последнего варианта собственной торговой системы. Начал с простого - при достижении ценой некоторого сигнального (контрольного) уровня - выставляется отложенный ордер. Код то я написал, и советник компелируется, только не работает! Буду признателен тем, кто укажет на ошибки в программе и подскажет как их исправить.
Валерий
if (PRICE_HIGH>=Level_1) { OrderSend(Symbol(),OP_SELLSTOP,0.1,Bid+iClose(0,PERIOD_W1,1),3,Ask+iClose(0,PERIOD_W1,1)+300*Point,Ask+iClose(0,PERIOD_W1,1)-300*Point); } else { if (PRICE_LOW<=Level_2) OrderSend(Symbol(),OP_BUYSTOP,0.1,Ask+iClose(0,PERIOD_W1,1),3,Bid+iClose(0,PERIOD_W1,1)-300*Point,Bid+iClose(0,PERIOD_W1,1)+300*Point); } //---- return(0); }
Если заглянуть в справочник констант
| Constant | Value | Description |
|---|---|---|
| PRICE_CLOSE | 0 | Close price. |
| PRICE_OPEN | 1 | Open price. |
| PRICE_HIGH | 2 | High price. |
| PRICE_LOW | 3 | Low price. |
...
мы увидим, что значение константы PRICE_HIGH = 2.
то есть, эта константа не имеет прямого отношения к значению цены High, она имеет другое назначение. К тому же, некорректно сравнивать константу с числом double - результат может оказаться непредсказуем.
Если Вы хотели использовать здесь цену High текущей свечи таймврейма, то правильней будет прибегнуть к элементу массива High[0].
Но это пол беды. Если Ваш скрипт вдруг заработает - он выставит Вам столько ордеров, что Вы будете очень удивлены :)
Уважаемые господа!
Черезнесколько лет торговли на форексе, решил таки попробовать написать советника для последнего варианта собственной торговой системы. Начал с простого - при достижении ценой некоторого сигнального (контрольного) уровня - выставляется отложенный ордер. Код то я написал, и советник компелируется, только не работает! Буду признателен тем, кто укажет на ошибки в программе и подскажет как их исправить.
Валерий
//+------------------------------------------------------------------+ //| IWR.mq4 | //| автор Дед, Тот Самый Дед! | //| http://www.metaquotes.net | //| Советник выставляет отложенные ордера по достижении определенных | //| контрольных уровней, передвигает стоп в безубыток при достижении | //| КУ выставляет на уровне безубытка по сути переворотный отложен- | //| ный ордер. //+------------------------------------------------------------------+ #property copyright "Copyright © 2011, MetaQuotes Software Corp." #property link "http://www.metaquotes.net" //+-------Внешние переменные советника-------------------------------+ extern string _P_Expert = "---------- Параметры советника"; extern double KU0; extern double Lots = 0.1; extern double Level_1= 50; extern double Level_2 =- 50; //+------------------------------------------------------------------+ //| expert initialization function extern int Slippage = 3; // Проскальзывание цены extern int NumberOfTry = 5; // Количество попыток | //+------------------------------------------------------------------+ int init() { double KU0 = iClose(0,PERIOD_W1,1);// цена закрытие предыдущей недели double Level_1 = KU0 + 50; // откат от КУ0 вверх double Level_2 = KU0 - 50; // откат от КУ0 вниз //---- return(0); } //+------------------------------------------------------------------+ //| expert deinitialization function | //+------------------------------------------------------------------+ int deinit() { //---- //---- return(0); } //+------------------------------------------------------------------+ //| Торговая функция | //+------------------------------------------------------------------+ OrderSend(Symbol(),OP_SELLSTOP,0.1,Bid+iClose(0,PERIOD_W1,1),3,Ask+iClose(0,PERIOD_W1,1)+300*Point,Ask+iClose(0,PERIOD_W1,1)-300*Point); OrderSend(Symbol(),OP_BUYSTOP,0.1,Ask+iClose(0,PERIOD_W1,1),3,Bid+iClose(0,PERIOD_W1,1)-300*Point,Bid+iClose(0,PERIOD_W1,1)+300*Point); //+------------------------------------------------------------------+ //| expert start function | //+------------------------------------------------------------------+ int start() { double KU0; //Сигнальный уровень double Level_1; //Сигнальный уровень double Level_2; //Сигнальный уровень KU0 = iClose(0,PERIOD_W1,1); //Цена закрытие предыдущей недели Level_1 = KU0 + 50; //Откат цены вверх от КУ0 Level_2 = KU0 - 50; //Откат цены вниз от КУ0 double OrderSellStop=KU0*Bid; double OrderBuyStop=KU0*Ask; //---- if (PRICE_HIGH>=Level_1) { OrderSend(Symbol(),OP_SELLSTOP,0.1,Bid+iClose(0,PERIOD_W1,1),3,Ask+iClose(0,PERIOD_W1,1)+300*Point,Ask+iClose(0,PERIOD_W1,1)-300*Point); } else { if (PRICE_LOW<=Level_2) OrderSend(Symbol(),OP_BUYSTOP,0.1,Ask+iClose(0,PERIOD_W1,1),3,Bid+iClose(0,PERIOD_W1,1)-300*Point,Bid+iClose(0,PERIOD_W1,1)+300*Point); } //---- return(0); } //+------------------------------------------------------------------+ //| Пользовательская функция | //+------------------------------------------------------------------+
выделено
Видимо никаких, потому что советник тупо стоит и ничего не делает в принципе! Возможно я неправильно расположил торговую функцию, либо вызов параметров функции не верен!?
Если там где ждете ничего не происходит, надо перейти ближе к входу.
Видимо никаких, потому что советник тупо стоит и ничего не делает в принципе! Возможно я неправильно расположил торговую функцию, либо вызов параметров функции не верен!?
Напрасно, автор, Вы ленитесь проверить параметры хотя бы с помощью Print().
скорее всего советник пытается выставить ордер, но не может - и вот почему (имхо):
OrderSend(Symbol(),OP_SELLSTOP,0.1,Bid+iClose(0,PERIOD_W1,1),3,Ask+iClose(0,PERIOD_W1,1)+300*Point,Ask+iClose(0,PERIOD_W1,1)-300*Point)
Это переводится как:
"Поставь отложенный ордер Sell Stop; по текущему символу; лотом 0.1; по цене = [Цена Bid] + [Цена закрытия недели]; проскальзывание = 3;
стоп = [Цена Ask] + [Цена закрытия недели] + [300 пипс]; тейк = [Цена Ask] + [Цена закрытия недели] - [300 пипс]"
Очевидно, что появление на рынке цены = [Цена Bid] + [Цена закрытия недели] - это нереально.
логичнее было бы сказать что то в этом роде:
OrderSend(Symbol(),OP_SELLSTOP,0.1,KU0,3,Level_1,Level_2);
Уважаемые господа!
Черезнесколько лет торговли на форексе, решил таки попробовать написать советника для последнего варианта собственной торговой системы. Начал с простого - при достижении ценой некоторого сигнального (контрольного) уровня - выставляется отложенный ордер. Код то я написал, и советник компелируется, только не работает! Буду признателен тем, кто укажет на ошибки в программе и подскажет как их исправить.
Валерий
Сразу в глаза бросается ошибка в самом главном коде, это ДНК. И, боюсь, такие ошибки уже не исправить.
Сразу в глаза бросается ошибка в самом главном коде, это ДНК. И, боюсь, такие ошибки уже не исправить.
:) но все же любопытно, на каком этапе он прекратит эти попытки
скорее всего советник пытается выставить ордер, но не может - и вот почему (имхо):
Если торги идут не по индексам или серебру\золоту, то даже не пытается: значение констант PRICE_HIGH,PRICE_LOW лежат внутри диапазона +/- 50 ( 2 всегда меньше 50, а 3 всегда больше -50 +/- цена закрытия недели) ==> условия под if() не выполняются. Если по какому-то из указанных инструментов, то очевидно, что запрограммировано не то, что имел ввиду автор.
логично. хорошо бы ему еще дельту КУ на точность помножить.
Уважаемые господа!
Черезнесколько лет торговли на форексе, решил таки попробовать написать советника для последнего варианта собственной торговой системы. Начал с простого - при достижении ценой некоторого сигнального (контрольного) уровня - выставляется отложенный ордер. Код то я написал, и советник компелируется, только не работает! Буду признателен тем, кто укажет на ошибки в программе и подскажет как их исправить.
Валерий