Навскидку:
void TrailingPositions(int mn) // добавляем параметр mn { double pBid, pAsk, pp; int ts; int t= 0; if(hung == true && ts(mn) > 0) ts = sl - ts(mn); // проверяем только переданный mn ... далее оставим как есть } // переписываем функцию ts без цикла, т.к. цикл выбора ордера уже снаружи int ts(int m) { int a = 0; if(OrderType() == OP_BUY && Bid > OrderOpenPrice() + (sl + sl/k)*Point) a = ((Bid - OrderOpenPrice() - sl*Point)/k)/Point; if(OrderType() == OP_SELL && Ask < OrderOpenPrice() - (sl + sl/k)*Point) a = ((OrderOpenPrice() - Ask - sl*Point)/k)/Point; return(a); }
В текущем коде из-за вложенности select-ов (внутри ts) и троекратного if-a всегда обрабатывается ордер с mn3.
Что-то я не аойму tral вызывается 3 раза для каждого mn отдельно, почему тогда он работает только для mn3?
И если это так то подскажите пожалуйста как это исправить
Спасибо, поняла!
Вы упускаете торговые возможности:
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Регистрация
Вход
Вы принимаете политику сайта и условия использования
Если у вас нет учетной записи, зарегистрируйтесь
У меня треллинг двигает только один ордер пока не закроет. Потом двигает второй и т.д.
Как мне сделать чтобы он двигал сказу все по данному символу?
Вот мой код
void tral(int m)
{
for (int i=0; i<OrdersTotal(); i++) {
if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
if (OrderSymbol()==Symbol() && OrderMagicNumber() == m) {
TrailingPositions();
}
}
}
}
//+------------------------------------------------------------------+
//| Сопровождение позиции простым тралом |
//+------------------------------------------------------------------+
void TrailingPositions() {
double pBid, pAsk, pp;
int ts;
int t= 0;
if(hung == true && ts(mn1) > 0) ts = sl - ts(mn1);
if(hung == true && ts(mn2) > 0) ts = sl - ts(mn2);
if(hung == true && ts(mn3) > 0) ts = sl - ts(mn3);
else ts = sl;
pp = MarketInfo(OrderSymbol(), MODE_POINT);
if (OrderType()==OP_BUY) {
pBid = MarketInfo(OrderSymbol(), MODE_BID);
if ((pBid-OrderOpenPrice())>ts/strs*pp) {
if (OrderStopLoss()<pBid-(ts+sl/10-1)*pp) {
ModifyStopLoss(pBid-ts*pp);
return;
}
}
}
if (OrderType()==OP_SELL) {
pAsk = MarketInfo(OrderSymbol(), MODE_ASK);
if (OrderOpenPrice()-pAsk>ts/strs*pp) {
if (OrderStopLoss()>pAsk+(ts+sl/10-1)*pp || OrderStopLoss()==0) {
ModifyStopLoss(pAsk+ts*pp);
return;
}
}
}
}
//+------------------------------------------------------------------+
//| Перенос уровня StopLoss |
//| Параметры: |
//| ldStopLoss - уровень StopLoss |
//+------------------------------------------------------------------+
void ModifyStopLoss(double ldStopLoss) {
bool fm;
fm=OrderModify(OrderTicket(),OrderOpenPrice(),ldStopLoss,OrderTakeProfit(),0,CLR_NONE);
}
int ts(int m)
{
int a = 0;
for (int i=0; i<OrdersTotal(); i++) {
if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
if (OrderSymbol()==Symbol() && OrderMagicNumber() == m) {
if(OrderType() == OP_BUY && Bid > OrderOpenPrice() + (sl + sl/k)*Point)
a = ((Bid - OrderOpenPrice() - sl*Point)/k)/Point;
if(OrderType() == OP_SELL && Ask < OrderOpenPrice() - (sl + sl/k)*Point)
a = ((OrderOpenPrice() - Ask - sl*Point)/k)/Point;
}
}
}
return(a);
}
А это вызовы в start()
tral(mn1);
tral(mn2);
tral(mn3);