Проверьте функцию LotSize и расставьте скобки в конструкции с if(). По-моему там локальная инициализация переменной lot, не понимаю почему компайлер молчит...
Может ещё появятся мысли по улучшению
Вроде перспектива у него есть.....
Подскажите как учесть при совокупном выставлении уровня Тэйкпрофита для пачки ордеров, допустимый уровень стоплевел
Иногда выскакивает ошибка 130
void modify() { x1=0; y1=0; profit_buy=0; profit_sell=0; n_buy =0; n_sell =0; op_buy =0; op_sell =0; op_buy_sred =0; op_sell_sred =0; lots_buy =0; lots_sell =0; t_p_buy =0; t_p_sell =0; delta_buy =0; delta_sell =0; max = 0; spred = MarketInfo(Symbol(),MODE_SPREAD); //====================== int j=OrdersTotal()-1; for (int i=j;i>=0;i--) { OrderSelect(i,SELECT_BY_POS,MODE_TRADES); if(OrderMagicNumber()==magic_buy && OrderSymbol()==Symbol()) { n_buy=n_buy+1; op_buy=op_buy+OrderOpenPrice(); lots_buy=lots_buy+OrderLots(); } if(OrderMagicNumber()==magic_sell && OrderSymbol()==Symbol()) { n_sell=n_sell+1; op_sell=op_sell+OrderOpenPrice(); lots_sell=lots_sell+OrderLots(); } } //--------------- if(n_buy>0) { op_buy_sred=op_buy/n_buy; op_buy_sred=NormalizeDouble( op_buy_sred,Digits); delta_buy=0.1/lots_buy; delta_buy=NormalizeDouble(delta_buy,2)* target_1*Point; t_p_buy=op_buy_sred+delta_buy; t_p_buy=NormalizeDouble(t_p_buy,Digits); } if(n_sell>0) { op_sell_sred=op_sell/n_sell; op_sell_sred=NormalizeDouble( op_sell_sred,Digits); delta_sell=0.1/lots_sell; delta_sell=NormalizeDouble(delta_sell,2)* target_1*Point; t_p_sell=op_sell_sred-delta_sell; t_p_sell=NormalizeDouble(t_p_sell,Digits); } if(t_p_buy!=t_p_buy1&&t_p_buy!=0) { t_p_buy1 = t_p_buy; j=OrdersTotal()-1; for (i=j;i>=0;i--) { OrderSelect(i,SELECT_BY_POS,MODE_TRADES); if(OrderType()==OP_BUY && OrderMagicNumber()==magic_buy&& OrderSymbol()==Symbol()) OrderModify(OrderTicket(),OrderOpenPrice(),OrderStopLoss(),t_p_buy,0,Blue); } } if(t_p_sell!=t_p_sell1&&t_p_sell!=0) { t_p_sell1 = t_p_sell; j=OrdersTotal()-1; for (i=j;i>=0;i--) { OrderSelect(i,SELECT_BY_POS,MODE_TRADES); if(OrderType()==OP_SELL && OrderMagicNumber()==magic_sell&& OrderSymbol()==Symbol()) OrderModify(OrderTicket(),OrderOpenPrice(),OrderStopLoss(),t_p_sell,0,Blue); } } return; }
В теории и надеюсь на практике.
Главная особенность это гарантированная не большая прибыль немного, но часто.
Основная задача максимально снизить возможную просадку.
Может ещё кто знает как можно улучшить эксперта?
Пока мыслей новых нет.
Подскажите как учесть при совокупном выставлении уровня Тэйкпрофита для пачки ордеров, допустимый уровень стоплевел
Иногда выскакивает ошибка 130
После того, как Вы расчитали новый уровень установки TP, сравните разницу между ним и текущей ценой со значением
MarketInfo( Symbol(), MODE_STOPLEVEL ) * Point
и в случае необходимости скорректируйте расчитанный уровень TP.
Но хочу отрбатить Ваше внимание на одну тонкость. При групповой модификации ордеров цена может сдвинуться ближе к значению расчитанного TP и тогда Вы вновь получите ошибку 130, но часть ордеров будет модифицирована. Для борьбы с этим явлением стоит добавить внешнюю переменную, которая будет содержать количество добавочных пунктов к значению stoplevel. Т.о. Ваш код можно поправить так:
extern int STOPLEVEL_addition = 1; // // . . . // void modify() { // // . . . // if( n_buy>0 ) { op_buy_sred = op_buy / n_buy; op_buy_sred = NormalizeDouble( op_buy_sred, Digits ); delta_buy = 0.1 / lots_buy; delta_buy = NormalizeDouble( delta_buy, 2 ) * target_1 * Point; t_p_buy = op_buy_sred + delta_buy; if ( ( t_p_buy - Bid ) < ( ( MarketInfo( Symbol(), MODE_STOPLEVEL ) + STOPLEVEL_addition ) * Point ) ) t_p_buy = Bid + ( MarketInfo( Symbol(), MODE_STOPLEVEL ) + STOPLEVEL_addition ) * Point; t_p_buy = NormalizeDouble( t_p_buy, Digits); } if( n_sell>0 ) { op_sell_sred= op_sell / n_sell; op_sell_sred= NormalizeDouble( op_sell_sred, Digits ); delta_sell = 0.1 / lots_sell; delta_sell = NormalizeDouble( delta_sell, 2 ) * target_1 * Point; t_p_sell = op_sell_sred - delta_sell; if ( ( Ask - t_p_sell ) < ( ( MarketInfo( Symbol(), MODE_STOPLEVEL ) + STOPLEVEL_addition ) * Point ) ) t_p_sell = Ask - ( MarketInfo( Symbol(), MODE_STOPLEVEL ) + STOPLEVEL_addition ) * Point; t_p_sell = NormalizeDouble( t_p_sell, Digits ); } // // . . . // return; } //modify()
И еще пара замечаний
1) Мне кажется Вы злоупотребляете нормализацией значений. Достаточно нормализовать t_p_buy и t_p_sell, смысла в нормализации значений op_buy_sred, delta_buy, op_sell_sred и delta_sell я не вижу.
2) Если Вы модифицируете ордера с разным значением OrderLots(), то расчет op_buy_sred и op_sell_sred неверный.
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
Здравствуйте.
Пару месяцев назад увидел ветку https://www.mql5.com/ru/forum/112887 ,прочитал, скачал советника, кое чего изменил, переделал. Пару месяцев тестировал на демо, теперь хочу ставить на реал, вернее уже как бы стоит и удалось даже заработать 20$. Но при депозите в 480$ cъел всё маржу и хорошо что рынок развернулся и всё хорошо закончилось.
Так как у меня нет опыта в программировании советников для работы на реале, прошу посмотреть тех у кого есть, может увидите касяки или появятся предложения по доработке.Код не большой и не займёт много времени что б разобратся.
Посмотрите пожалуйста.