Использование CExpert vs свой велосипед - страница 2

 
ITeXPert:

Странно то что если я в своем классе переопределяю функцию CheckOpenLong() и CheckOpenLong()

 то советник вообще не входит в рынок, притом второй if можно не указывать, т.е. вся логика ломается об первое условие

В данном случае - видимо, PositionSelect() возвращает false, ведь позиции у вас нет, после чего происходит выход из функции. В рынок, действительно, так не войдешь.

Пройдитесь в дебаггере - посмотрите, куда идет управление.

 
Laryx:

В данном случае - видимо, PositionSelect() возвращает false, ведь позиции у вас нет, после чего происходит выход из функции. В рынок, действительно, так не войдешь.

Пройдитесь в дебаггере - посмотрите, куда идет управление.

Вход в рынок был в другом месте, ну да ладно, я пошел другим путем... 

Судя по поведению генерированного советника надо половину его методов переопределить, чтобы работал как задумано.

Решил городить свой велосипед, но для упрощения жизни использовать классы.

Включил необходимые файлы и объявил две переменные:

CTrade trade;
CPositionInfo postiton;

 Далее в коде:

void OnTick()
  {
   if (!postiton.Select(_Symbol)) //Пробовал заменять на if (!PositionSelect(_Symbol)) - тот же результат
   {
      trade.Buy(0.1,NULL,0,0,50,"ST");
   }
   return (0);
}

 Т.е. если нет открытой позиции - покупаем. Результат нулевой, советник сделку не открывает вообще.

 

Совсем уже голова не варит... наконец-то заработал мой советник, остался еще один вопрос, по изменению уровня тейк профита. По умолчанию у меня выставляется тейк профит в 50 пунктов, но если рынок идет не в ту сторону - каждые 50 пунктов мы "доливаемся". Соответственно меняется и результирующая цена по позиции, соответственно нужно двигать и тейк профит. Т.е. если мы купили по по цене 1,500, а рынок ушел до 1,450, советник делает еще одну сделку тем же объемом 0.1 и цена позиции становиться 1,475. Тейк профит нужно сдвинуть с 1.550 на 1.525. Но не могу корректно рассчитать уровень тейк профита, т.к. position.

double TP = NormalizeDouble(position.PriceCurrent()-50*_Point,(int)SymbolInfoInteger(_Symbol,SYMBOL_DIGITS));

 PriceCurrent() после доливки не равняется 1,475. Либо же я не понимаю назначение этой функции.

 
ITeXPert:

Совсем уже голова не варит... наконец-то заработал мой советник, остался еще один вопрос, по изменению уровня тейк профита. По умолчанию у меня выставляется тейк профит в 50 пунктов, но если рынок идет не в ту сторону - каждые 50 пунктов мы "доливаемся". Соответственно меняется и результирующая цена по позиции, соответственно нужно двигать и тейк профит. Т.е. если мы купили по по цене 1,500, а рынок ушел до 1,450, советник делает еще одну сделку тем же объемом 0.1 и цена позиции становиться 1,475. Тейк профит нужно сдвинуть с 1.550 на 1.525. Но не могу корректно рассчитать уровень тейк профита, т.к. position.

 PriceCurrent() после доливки не равняется 1,475. Либо же я не понимаю назначение этой функции.

PriceCurrent() - это, насколько я понимаю, текущая цена символа, в котором открыта позиция. С чего бы это она будет равна 1.465 ?
 
Laryx:
PriceCurrent() - это, насколько я понимаю, текущая цена символа, в котором открыта позиция. С чего бы это она будет равна 1.465 ?

Это должна быть цена позиции, т.к. переменная position имеет тип CPositionInfo, а не CSymbolInfo.

Посмотрел еще раз сгенерированный советник, и свой и решил попробовать использовать CTrailingStop для трейлинга позиции, даже заработало и впринципе неплохо.

Почитав документацию понял, что для определения входить или не входить в рынок используются сигналы (некоторый их набор). Теперь озадачился как сделать свой собственный сигнал, добавить его как поставщика сигналов к имеющимся Adaptive Moving Avarage и Stohastic и поставить ему наивысший приоритет. т.к. переопределять кучу методов имеющихся стандартных классов не хочется. В своем сигнале хочу запретить переворачивать позицию или входить в рынок в противоположном направлении, если есть открытая позиция (то что и спрашивал в самом начале)

 
ITeXPert:

Это должна быть цена позиции, т.к. переменная position имеет тип CPositionInfo, а не CSymbolInfo.

Ну, что "должно быть" - можно спорить, а реально все сводится к получению переменной позиции типа POSITION_PRICE_CURRENT, и что она конкретно означает - определяется разработчиками.

Теперь озадачился как сделать свой собственный сигнал, добавить его как поставщика сигналов к имеющимся Adaptive Moving Avarage и Stohastic и поставить ему наивысший приоритет. т.к. переопределять кучу методов имеющихся стандартных классов не хочется. В своем сигнале хочу запретить переворачивать позицию или входить в рынок в противоположном направлении, если есть открытая позиция (то что и спрашивал в самом начале)

Все верно, именно такой принцип в Стандартной Библиотеке и используется. Есть цикл статей, там с примерами показано, как сделать такой сигнал.

Причина обращения: