Я не волшебник, я только учусь!

 

Уважаемые господа!

Черезнесколько лет торговли на форексе, решил таки попробовать написать советника для последнего варианта собственной торговой системы. Начал с простого - при достижении ценой некоторого сигнального (контрольного) уровня - выставляется отложенный ордер. Код то я написал, и советник компелируется, только не работает! Буду признателен тем, кто укажет на ошибки в программе и подскажет как их исправить.

Валерий

Файлы:
iwr.mq4  4 kb
 
Есть такая функция Print(), еще есть Comment(), Alert(). При помощи них посмотрите какие значения передаете в OrderSend().
 
Integer:
Есть такая функция Print(), еще есть Comment(), Alert(). При помощи них посмотрите какие значения передаете в OrderSend().

Видимо никаких, потому что советник тупо стоит и ничего не делает в принципе! Возможно я неправильно расположил торговую функцию, либо вызов параметров функции не верен!?
 
sivanik:

Уважаемые господа!

Черезнесколько лет торговли на форексе, решил таки попробовать написать советника для последнего варианта собственной торговой системы. Начал с простого - при достижении ценой некоторого сигнального (контрольного) уровня - выставляется отложенный ордер. Код то я написал, и советник компелируется, только не работает! Буду признателен тем, кто укажет на ошибки в программе и подскажет как их исправить.

Валерий


  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].

Но это пол беды. Если Ваш скрипт вдруг заработает - он выставит Вам столько ордеров, что Вы будете очень удивлены :)

 
sivanik:

Уважаемые господа!

Черезнесколько лет торговли на форексе, решил таки попробовать написать советника для последнего варианта собственной торговой системы. Начал с простого - при достижении ценой некоторого сигнального (контрольного) уровня - выставляется отложенный ордер. Код то я написал, и советник компелируется, только не работает! Буду признателен тем, кто укажет на ошибки в программе и подскажет как их исправить.

Валерий

//+------------------------------------------------------------------+
//|                                                          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);
  }
//+------------------------------------------------------------------+
//| Пользовательская функция                                         |
//+------------------------------------------------------------------+

выделено

 
sivanik:

Видимо никаких, потому что советник тупо стоит и ничего не делает в принципе! Возможно я неправильно расположил торговую функцию, либо вызов параметров функции не верен!?

Если там где ждете ничего не происходит, надо перейти ближе к входу.
 
sivanik:

Видимо никаких, потому что советник тупо стоит и ничего не делает в принципе! Возможно я неправильно расположил торговую функцию, либо вызов параметров функции не верен!?


Напрасно, автор, Вы ленитесь проверить параметры хотя бы с помощью 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);
 
sivanik:

Уважаемые господа!

Черезнесколько лет торговли на форексе, решил таки попробовать написать советника для последнего варианта собственной торговой системы. Начал с простого - при достижении ценой некоторого сигнального (контрольного) уровня - выставляется отложенный ордер. Код то я написал, и советник компелируется, только не работает! Буду признателен тем, кто укажет на ошибки в программе и подскажет как их исправить.

Валерий

Сразу в глаза бросается ошибка в самом главном коде, это ДНК. И, боюсь, такие ошибки уже не исправить.

 
Sevrer:

Сразу в глаза бросается ошибка в самом главном коде, это ДНК. И, боюсь, такие ошибки уже не исправить.


:) но все же любопытно, на каком этапе он прекратит эти попытки
 
NotNull:



скорее всего советник пытается выставить ордер, но не может - и вот почему (имхо):


Если торги идут не по индексам или серебру\золоту, то даже не пытается: значение констант PRICE_HIGH,PRICE_LOW лежат внутри диапазона +/- 50 ( 2 всегда меньше 50, а 3 всегда больше -50 +/- цена закрытия недели) ==> условия под if() не выполняются. Если по какому-то из указанных инструментов, то очевидно, что запрограммировано не то, что имел ввиду автор.
 
VladislavVG:
Если торги идут не по индексам или серебру\золоту, то даже не пытается: значение констант PRICE_HIGH,PRICE_LOW лежат внутри диапазона +/- 50 ( 2 всегда меньше 50, а 3 всегда больше -50 +/- цена закрытия недели) ==> условия под if() не выполняются. Если по какому-то из указанных инструментов, то очевидно, что запрограммировано не то, что имел ввиду автор.

логично. хорошо бы ему еще дельту КУ на точность помножить.
Причина обращения: