Нужна помощь в коррекции советника

 
Я уже рассказывал об этом советнике. Помогли, написали... но есть проблемка...
Короктко выложу его суть:
Есть входные переметры:
шаг (количество пунктов через которые рассталвяются ордера)
диапазон - зона расстановки ордеров
тейкпрофит - величина профита в ордерах

Принцып работы: постоянно анализируя курс советник ищет цену, которая будет кратна шагу (например при шаге в 50п это будет 1850,1900,1950 и т.д.) и находиться в пределах диапазона. За пределами диапазона торговля не ведется. если такая цена достигнута - советник проверяет наличие ордеров бай и сел одновременно на шаг выше и на шаг ниже от текущей цены. Если нет - выставляет. Вот и все :)

Ну так вот - есть советник, но есть и проблемка. Писали бесплатно, поэтому не могу давить на автора - он и так показал себя только с лучшей стороны. Вобщем - все как я хотел - диапазон задает, шаг расстановки ордеров ствит... вот только почему-то тестируется только на доллар/йене и евро/йене. На остальных валютах не открывает ни одного оредра. Автор щас занят - помочь не может, а я не могу понять почему возникает такая ошибка.
Можно здесь попросить помощи?
Мне кажется суть проблеммы в строке где советник определяет кратность курса к шагу. Например если шаг=50 а курс 1.1879, ордера проверятся и выставляться не будут, а если курс =1.1850 - тогда будут. Ну думаю с этим все ясно.
Вобщем привожу строку как есть:

if ( MathMod ( Bid, Point * Step ) == 0){

Где тут ошибка - почему не обрабатывает курсы типа *.**** а только ***.**?
 
Смотри справку по Digits
 
Да я уже смотрел.. вроде все правильно написано... :-/.. но я же не програмист :) Поэтому и обратился за помощью.
 
Да я уже смотрел.. вроде все правильно написано... :-/.. но я же не програмист :) Поэтому и обратился за помощью.


Код советника в студию, разберемся. :)
 
//+------------------------------------------------------------------+
//| Trade50.mq4 |
//| Copyright © 2006, Cherednichenko W. A |
//| http://www. |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2006, Cherednichenko W. A"
#property link "http://www."

#include <WinUser32.mqh>//для MessageBox()


extern double Step;
extern double TakeProfit = 25;
extern double StartValue = 115.0;
extern double HighLevel = 300;
extern double LowLevel = 300;
//+------------------------------------------------------------------+
//| expert initialization function |
//+------------------------------------------------------------------+
int init()
{
//----

//----
return(0);
}
//+------------------------------------------------------------------+
//| expert deinitialization function |
//+------------------------------------------------------------------+
int deinit()
{
//----

//----
return(0);
}
//+------------------------------------------------------------------+
//| expert start function |
//+------------------------------------------------------------------+
int start()
{
//----
// MessageBox("мой текст", "заголовок", MB_OK);
double ticket = 0;
int ttl = OrdersTotal();
int cnt = 0;
for( cnt=0;cnt<ttl;cnt++ ){
if( OrderSelect( cnt, SELECT_BY_POS ) == true)
{
if (Bid == OrderOpenPrice() ) return( 0 );
}
}

if( (Bid > StartValue + HighLevel * Point) || (Bid < StartValue - LowLevel * Point) ) return (0);

if ( MathMod ( Bid, Point * Step ) == 0){
ticket = OrderSend(Symbol(), OP_BUY, 1, Ask, 3, 0, Ask + TakeProfit * Point, "My order #", 16384, 0, Green);
ticket = OrderSend(Symbol(), OP_SELL, 1, Bid, 3, 0, Bid - TakeProfit * Point, "My order #", 16384, 0, Green);
}

//-------------------------------------------------------------------+
return(0);
}
//+------------------------------------------------------------------+
 
...
RefreshRates();
if ( MathMod(Bid / Point, Step) == 0)
{
ticket = OrderSend(Symbol(), OP_BUY, 1, Ask, 3, 0, NormalizeDouble(Ask + TakeProfit * Point),
"My order #", 16384, 0, Green);
ticket = OrderSend(Symbol(), OP_SELL, 1, Bid, 3, 0, NormalizeDouble(Bid - TakeProfit * Point),
"My order #", 16384, 0, Green);
}
...
 
Выдает ошибку с указанием на скобки после "NormalizeDouble". Их забрать или как?
 
Забираю "NormalizeDouble" и скобки - все работает. Но я не знаю что делает эта функция и что я в результате теряю :)
 
Еще один вопрос задам. если не сложно - помогите еще раз.
А можно сделать так, чтобы над ХайЛевел советник ставил только ордера на продажу по тем же установкам (шаг, профит). А под ЛоуЛевел - ордера на покупку соответственно?
Но добавить еще один диапазон - дотустим ХайЛимит и ЛоуЛимит - вне пределов которого торговля не ведется. По сути это аналог текущего Лоу и хай Левела :)
Это сложно?
 
Пардон, слегка накосячил (сам про это все время забываю). Правильно так:
...
// вызвать MarketInfo() однократно, но не в блоке init()! Лучше всего в начале блока start()
// результат sym_digits запомнить
int start()
{
static bool run_once = false;
static sym_digits;
if (run_once == false)
{
sym_digits = MarketInfo(Symbol(), MODE_DIGITS); // число разрядов после десятичной точки
run_once = true;
}
...
RefreshRates();
if ( MathMod(Bid / Point, Step) == 0)
{
ticket = OrderSend(Symbol(), OP_BUY, 1, Ask, 3, 0, NormalizeDouble(Ask + TakeProfit * Point, sym_digits),
"My order #", 16384, 0, Green);
ticket = OrderSend(Symbol(), OP_SELL, 1, Bid, 3, 0, NormalizeDouble(Bid - TakeProfit * Point, sym_digits),
"My order #", 16384, 0, Green);
}
...
}
... что-то вроде.
Еще один вопрос задам. если не сложно - помогите еще раз.
А можно сделать так, чтобы над ХайЛевел советник ставил только ордера на продажу по тем же установкам (шаг, профит). А под ЛоуЛевел - ордера на покупку соответственно?
Но добавить еще один диапазон - дотустим ХайЛимит и ЛоуЛимит - вне пределов которого торговля не ведется. По сути это аналог текущего Лоу и хай Левела :)
Это сложно?


Это несложно. Надо только тщательно, лучше всего с помощью карандаша и бумаги, расписать и формализовать все условия в зависимости от желаемого результата, и затем методично вбить их в логические конструкции if ... then ... else и\или switch ... case

Но я не знаю что делает эта функция и что я в результате теряю :)


См. справку.

но я же не програмист :)


Придется осваивать :)))
 
Большое спасибо alexjou за помощь. Думаю что уже на таком этапе я сумею его подкорректировать. Да и даже в такой конфигурации меня его работа полностью устраивает.
Всем больших профитов и легких алгоритмов ;-)
Причина обращения: