...ага... total передвинул к контролю за позициями - логически МОГЛА произойти ситуация, когда ордеры выставляются ПОСЛЕ подсчёта позиций.
Из кода видно, что на каждом тике идет расчет total=CalculateCurrentOrders(SymbolName);
Эта же ф-ция возвращает количество (только КОЛИЧЕСТВО) открытых ордеров, соответствующих заданным условиям. Причем если есть ордера BUY, то ф-ция вернет их количество, если их нет, то вернет количество ордеров SELL со знаком МИНУС (отрицательное число). А если нет ни тех ни других, то вернется 0.
total расчитывается перед циклом for(i=0;i<total;i++). Как думаете будут ли контролироваться ордера (выполняться цикл), если есть только SELL ордера?
Если пытаетесь контролировать открытые позиции, то лучше использовать такую конструкцию (писал выше):
т.к. в случае с for(i=0;i<total;i++), возможна ситуация когда ордер с порядковой позицией №1 (к примеру) обработан и закрыт, т.е. измениться(уменьшится) кол-во ордеров и ордер с порядковой позицией №2 станет №1, а цикл перейдет к №2 и следовательно ордер выбран и обработан не будет.
И еще в ф-цию int CalculateCurrentOrders(string symbol) передается параметр symbol, но в ней не используется, уберите его он там не нужен.
- CalculateCurrentOrders поменял - его я перетянул с примера... переделал
под себя... но видно не додумал до конца - там ЯВНЫЙ глюк - СПАСИБО
(что значит незасахаренный моск :)))
для подсчёта ордеров по-раздельности я использую CalculateBySellOrders
total=OrdersTotal()-1;
for(i=total;i>=0;i--)
попробовал, но на закрытие ордеров это не повлияло
ордер должен закрываться тогда, когда приходит сигнал на закрытие
//сигнал к закрытию открытой позиции на покупку - когда имея сигнал
на ПОКУПКУ, линия возвращается к уровню покупки "-100"
if(iCTek<=iClvlBUY && iCPrev>iClvlBUY)
//сигнал к закрытию открытой позиции на продажу - когда имея сигнал
на ПРОДАЖУ, линия возвращается к уровню продажи "100"
if(iCTek>=iClvlSELL && iCPrev<iClvlSELL)
... а сигнал к покупке или продаже НЕ ДОЛЖЕН являтся сигналом
к закрытию противоположной позиции, поскольку противоположная
позиция может быть более прибыльной, чем вновь открываемая.
po_saa:
так ВСЕ значения (ну разве что кроме OPEN) будут так меняться...
все остальные расчитываются от OPEN
что тогда кроме CLOSE?
Просто сравнивать значения на 1-м и 2-м баре. А если сравнивать
на 0-м, то иногда появляются темы типа "Сигнала не было, а ордер
открылся, почему?". Главное отдавать себе отчет, что и для
чего делается.
Для авторизации и пользования сайтом MQL5.com необходимо разрешить использование файлов Сookie.
Пожалуйста, включите в вашем браузере данную настройку, иначе вы не сможете авторизоваться.
Вы вошли в аккаунт. Двухфакторная аутентификация отключена. Настройте её заново и отсканируйте новый QR-код или продолжите с отключённой двухфакторной аутентификацией.
...ага... total передвинул к контролю за позициями - логически МОГЛА произойти ситуация, когда ордеры выставляются ПОСЛЕ подсчёта позиций.
Из кода видно, что на каждом тике идет расчет total=CalculateCurrentOrders(SymbolName);
Эта же ф-ция возвращает количество (только КОЛИЧЕСТВО) открытых ордеров, соответствующих заданным условиям. Причем если есть ордера BUY, то ф-ция вернет их количество, если их нет, то вернет количество ордеров SELL со знаком МИНУС (отрицательное число). А если нет ни тех ни других, то вернется 0.
total расчитывается перед циклом for(i=0;i<total;i++). Как думаете будут ли контролироваться ордера (выполняться цикл), если есть только SELL ордера?
Если пытаетесь контролировать открытые позиции, то лучше использовать такую конструкцию (писал выше):
т.к. в случае с for(i=0;i<total;i++), возможна ситуация когда ордер с порядковой позицией №1 (к примеру) обработан и закрыт, т.е. измениться(уменьшится) кол-во ордеров и ордер с порядковой позицией №2 станет №1, а цикл перейдет к №2 и следовательно ордер выбран и обработан не будет.
И еще в ф-цию int CalculateCurrentOrders(string symbol) передается параметр symbol, но в ней не используется, уберите его он там не нужен.
для подсчёта ордеров по-раздельности я использую CalculateBySellOrders
total=OrdersTotal()-1;
for(i=total;i>=0;i--)
попробовал, но на закрытие ордеров это не повлияло
ордер должен закрываться тогда, когда приходит сигнал на закрытие
//сигнал к закрытию открытой позиции на покупку - когда имея сигнал на ПОКУПКУ, линия возвращается к уровню покупки "-100"
if(iCTek<=iClvlBUY && iCPrev>iClvlBUY)
//сигнал к закрытию открытой позиции на продажу - когда имея сигнал на ПРОДАЖУ, линия возвращается к уровню продажи "100"
if(iCTek>=iClvlSELL && iCPrev<iClvlSELL)
переделал
Логику смотреть, честно говоря, нет никаго желания. Распринтуйте в интересных местах. Думаю, что есть логическая ошибка.
что тогда кроме CLOSE?
так ВСЕ значения (ну разве что кроме OPEN) будут так меняться... все остальные расчитываются от OPEN
что тогда кроме CLOSE?
Просто сравнивать значения на 1-м и 2-м баре. А если сравнивать на 0-м, то иногда появляются темы типа "Сигнала не было, а ордер открылся, почему?". Главное отдавать себе отчет, что и для чего делается.