Советник смешивает ордера на покупку и продажу - страница 3

 
WHRoeder:

int OrderType = OrderType() не в порядке, одно может скрывать другое (локальные объявления скрывают глобальные без ошибок). Попробуйте

int orderType = OrderType()

Оригинальный код ... ...

int orderType;
   for(cnt = total-1; cnt >= 0; cnt--)
   {
      while (!OrderSelect(cnt, SELECT_BY_POS)) {Sleep(500);}
      orderType = OrderType();

... что фактически то же самое, что вы предлагаете?

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

 

Нет, это не так.

Тип заказа, объявленный вне цикла, эффективно передаст значение orderType в следующий цикл, и даже если произойдет ошибка, это значение попадет в следующее условие.

Если вы объявите внутри цикла с немедленной установкой значения OrderType(), то для такой ошибки не останется места.

(возможно, это не проблема ОП, но это может предотвратить другие проблемы), что же не попробовать?

Также полсекунды на sleep - это немного перебор. While loop должен быть в порядке с 10 милисекундным таймером сна без какого-либо удара по нагрузке на процессор (ну почти :P).

 
forexCoder:

Нет, это не так.

Тип заказа, объявленный вне цикла, эффективно передаст значение orderType в следующий цикл, и даже если произойдет ошибка, это значение попадет в следующее условие.

Если вы объявите внутри цикла с немедленной установкой значения OrderType(), то для такой ошибки не останется места.

(возможно, это не проблема ОП, но это может предотвратить другие проблемы), что же не попробовать?

Также полсекунды на sleep - это немного перебор. Цикл While должен быть в порядке с 10-милисекундным таймером сна без какого-либо удара по нагрузке на процессор (ну почти :P).


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

Я знаю только то, что переменная с именем OrderType никак не может взаимодействовать с одноименным методом, а также то, что местоположение объявления не имеет никакого отношения к моей проблеме.

Проблема в том, что OrderTicket(), OrderStoploss(), ... не дают данных для одного и того же заказа после использования OrderSelect().

Если я использую локальные переменные и устанавливаю их после вызова OrderSelect(), это работает, но если я использую непосредственно OrderTicket() или OrderStoploss(), это дает неверные значения.


Почему в моем коде OrderStopLoss() возвращает стоплосс другого ордера внутри той же итерации цикла "for"?

 

Вот полный код советника:

Проблема заключается в первом цикле "for" метода updateFbOrders().

Для проверки я добавляю на график индикаторы Аллигатор и Фрактал и нахожу график, на котором последний верхний фрактал находится выше линий Аллигатора, а последний нижний фрактал - ниже линий Аллигатора.

Тогда он должен создать отложенные ордера на покупку и продажу. Если произошел прорыв одного из фракталов, он откроет немедленный ордер.

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

Проверьте окна оповещений и найдите сообщение, подобное этому: Count: 1 Stoploss 1.41008000 для ордера на покупку: 46454014 orderType: 5, и если вы проверите ордер 46454014, вы увидите, что на самом деле это ордер на продажу. И он будет продолжать изменять ордера, даже если стоплосс не изменится, это потому, что он берет неправильный уровень стоплосса.
Файлы:
 

Это глупо. Вы не вставляете весь код.

У вас есть

areBuyOrdersInProfitAt

функция, которую мы не видим внутри, пожалуйста, вставьте ее. Сейчас уже очень вероятно, что вы допустили ошибку где-то еще. Используете ли вы еще где-нибудь функцию OrderSelect?

Также, где вы устанавливаете переменные longSL и shortSL? Пожалуйста, вставьте и эту часть кода.

EDIT: вы вставили его, пока я печатал, теперь смотрю на новое сообщение.

 
forexCoder:

Это глупо. Вы не вставляете весь код.

У вас есть

areBuyOrdersInProfitAt

функция, которую мы не видим внутри, пожалуйста, вставьте ее. Сейчас уже очень вероятно, что вы допустили ошибку где-то еще. Используете ли вы еще где-нибудь функцию OrderSelect?

Также, где вы устанавливаете переменные longSL и shortSL? Пожалуйста, вставьте и эту часть кода.

EDIT: Вы вставили его, пока я печатал, теперь смотрю на новое сообщение.

Привет, forexCoder

Я добавил советника в предыдущее сообщение.


Но я думаю, что вы указали на проблему: я использую OrderSelect() в методе "areBuyOrdersInProfitAt". :-)))))))))))

 

Да, как я и думал.

В areBuyOrdersInProfitAt содержится другая функция OrderSelect, и она перезаписывает то, что делает та, что в исходном фрагменте. Когда эта функция areBuyOrdersInProfitAt возвращается, OrderSelect изменяется, и билет тоже. В этом случае вы всегда должны получать последний заказ в вашем списке.

 

Как только вы начнете использовать OrderSelect в цикле for, перебирая все ордера, вы не можете создать еще один цикл OrderSelect for внутри него, потому что когда второй цикл вернется, вы будете использовать билет последнего ордера в вашем торговом пуле.

У вас довольно длинный код, поэтому мне не очень хочется его исправлять (извините:P), но теперь у вас есть указатель в правильном направлении.

 
dvarrin:

Но я думаю, что вы указали на проблему: я использую OrderSelect() в методе "areBuyOrdersInProfitAt". :-)))))))))))

Приятно слышать, что вы на пути к решению :-)
 
RaptorUK:
Приятно слышать, что вы на пути к решению :-)
Большое спасибо всем. Это была действительно глупая ошибка, которую я совершил :-((