- [Архив!] Напишу советника бесплатно
- Помогите "починить советник"
- Как добавить StopLoss в советника
Чтобы быть уверенным что обе цены зашли за МА, советую писать if (Ask < ima) дл продаж и if (Bid > ima) для покупок, поможет избежать совершения сделок когда Бид и Аск по разные стороны от МА. Но это всё равно не гуд, открываться прямо на линии МА.
Строка OrderModify(OrderTicket(), OrderProfit(), SL, TP, 0); - угадайте что не так )))
Да и в конструкции ниже не вижу смысла в двойной модификации:
TP = NormalizeDouble(Ask + TakeProfit * Point, Digits); OrderModify(ticket, OrderProfit(), SL, TP, 0); SL = NormalizeDouble(Bid - StopLoss * Point, Digits); OrderModify(ticket, OrderProfit(), SL, TP, 0);
Достаточно один раз модифицировать, последней строчкой.
Да, и для продаж всё же
TP = NormalizeDouble(Bid - TakeProfit * Point, Digits);//хотя тут тоже АСК можно, всё равно закрываться позиция по Аск будет... SL = NormalizeDouble(Ask + StopLoss * Point, Digits);
А что насчёт добавки к МА, наверное имелось в виду добавить это условие:
if (Bid > ima+NormalizeDouble(dev*Point,Digits)) - покупка и if(Ask < ima-NormalizeDouble(dev*Point,Digits)) - продажа, где dev - отступ от МА в пунктах.
Чтобы быть уверенным что обе цены зашли за МА, советую писать if (Ask < ima) дл продаж и if (Bid > ima) для покупок, поможет избежать совершения сделок когда Бид и Аск по разные стороны от МА. Но это всё равно не гуд, открываться прямо на линии МА.
Да и в конструкции ниже не вижу смысла в двойной модификации:
Достаточно один раз модифицировать, последней строчкой.
Да, и для продаж всё же
А что насчёт добавки к МА, наверное имелось в виду добавить это условие:
Есть ещё неучтённый StopLevel. А он ещё бывает нулю равен, и тогда высчитывается по-разному. В Альпари, например, он всегда нулевой, но ограничения есть, и они считаются как спред*2
Значит нужно сначала определиться с уровнем StopLevel:
Глобально:
int level=0, sp=0;
Затем в start() :
sp=MarketInfo(sy,MODE_SPREAD); //-------------- Проверка StopLevel --------------- level=MarketInfo(sy,MODE_STOPLEVEL ); // Значение уровня установки стопов if (level==0) level=sp*2;
А потом уже сравнивать размер стоп-приказа с полученным уровнем и использовать рассчитанные верные значения для стоп-приказов:
//+----------------------------------------------------------------------------+ double pa=MarketInfo(Symbol(),MODE_ASK), // цена Ask pb=MarketInfo(Symbol(),MODE_BID), // цена Bid sl=0, tp=0; if(OrderType()==OP_BUY) { sl=NormalizeDouble(MathMin(pb-StopLoss*Point,pb-(level+1)*Point),Digits); tp=NormalizeDouble(MathMax(pb+TakeProfit*Point,pb+(level+1)*Point),Digits); // далее используем полученные уровни // sl для цены StopLoss // и tp для цены TakeProfit } if(OrderType()==OP_SELL) { sl=NormalizeDouble(MathMax(pa+StopLoss*Point,pa+(level+1)*Point),Digits()); tp=NormalizeDouble(MathMin(pa-TakeProfit*Point,pa-(level+1)*Point),Digits()); // далее используем полученные уровни // sl для цены StopLoss // и tp для цены TakeProfit } //+----------------------------------------------------------------------------+
Да там если придираться по полной (как для запуска на реал), то пальцев не хватит все косяки перечислять )))
Так я ж не придираюсь. Но такие-то расчёты просто обязаны быть, даже в советнике для тестера. Это ж азы. А то потом репу чешут: что, да от куда...
ЗЫ. А в приложенный код не глядел, чтобы плохо не стало
Но это всё равно не гуд, открываться прямо на линии МА.
Какие-то технические проблемы или просто религия не позволяет?
Какие-то технические проблемы или просто религия не позволяет?
Религия - зло, конечно не позоляет )))
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования