...потом появится мысль про отдельные стоплоссы и тейкпрофиты)
Нужно делать многосерийный советник. Во входных параметрах задается серия стопов, серия профитов, серия траллов...
При запуске создаются структуры для каждой серии и это всё раскладывается по структурам. Далее советник каждый тик перебирает Серию структур и каждую ведёт по своим параметрам.
То есть получается неограниченное число советников в одном...
Элементарно, пользуйтесь на здоровье))
extern int Trailing1 = 100;
extern int StartTrailing2 = 150;
extern int Trailing2 = 50;
{
//---------------------------------
double buy_last_price = -1;
double sell_last_price = -1;
double buy_orders = 0;
double sell_orders = 0;
for(int i=OrdersTotal()-1;i>=0;i--) if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES) && OrderSymbol()==Symbol() && OrderMagicNumber()==Magik)
{
if(OrderType()==OP_BUY) {if(buy_last_price==-1) buy_last_price=OrderOpenPrice(); buy_orders++;}
if(OrderType()==OP_SELL){if(sell_last_price==-1)sell_last_price=OrderOpenPrice(); sell_orders++;}
}
//TrailingStart//
for(i=OrdersTotal()-1;i>=0;i--) if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES) && OrderSymbol()==Symbol() && OrderMagicNumber()==Magik)
{
if (buy_orders==1){ //если в рынке 1 ордер buy
if (Trailing1>0 && (Bid-buy_last_price)>=StartTrailing1*Point && OrderType()==OP_BUY && NormalizeDouble(Bid-(Trailing1 +1)*Point,Digits)>NormalizeDouble(OrderStopLoss(),Digits)
&& NormalizeDouble(Bid-Trailing1 *Point,Digits)>=NormalizeDouble(OrderOpenPrice(),Digits))
int modify = OrderModify (OrderTicket(), OrderOpenPrice(), NormalizeDouble(Bid-Trailing1 *Point,Digits), OrderTakeProfit(), 0, Blue);
}
if (sell_orders==1){ //если в рынке 1 ордер sell
if (Trailing1>0 && (sell_last_price-Ask)>=StartTrailing1*Point && OrderType()==OP_SELL && (NormalizeDouble(Ask+(Trailing1 +1)*Point,Digits)<NormalizeDouble(OrderStopLoss(),Digits) || OrderStopLoss()==0)
&& NormalizeDouble(Ask+Trailing1 *Point,Digits)<=NormalizeDouble(OrderOpenPrice(),Digits))
modify = OrderModify (OrderTicket(), OrderOpenPrice(), NormalizeDouble(Ask+Trailing1 *Point,Digits), OrderTakeProfit(), 0, Red);
}
//------------------------------------------------------------+
if (buy_orders>=2){ //если в рынке 2 и больше ордера buy
if (Trailing2>0 && (Bid-buy_last_price)>=StartTrailing2*Point && OrderType()==OP_BUY && NormalizeDouble(Bid-(Trailing2 +1)*Point,Digits)>NormalizeDouble(OrderStopLoss(),Digits)
&& NormalizeDouble(Bid-Trailing2 *Point,Digits)>=NormalizeDouble(OrderOpenPrice(),Digits))
modify = OrderModify (OrderTicket(), OrderOpenPrice(), NormalizeDouble(Bid-Trailing2 *Point,Digits), OrderTakeProfit(), 0, Blue);
}
if (sell_orders>=2){ //если в рынке 2 и больше ордера sell
if (Trailing2>0 && (sell_last_price-Ask)>=StartTrailing2*Point && OrderType()==OP_SELL && (NormalizeDouble(Ask+(Trailing2 +1)*Point,Digits)<NormalizeDouble(OrderStopLoss(),Digits) || OrderStopLoss()==0)
&& NormalizeDouble(Ask+Trailing2 *Point,Digits)<=NormalizeDouble(OrderOpenPrice(),Digits))
modify = OrderModify (OrderTicket(), OrderOpenPrice(), NormalizeDouble(Ask+Trailing2 *Point,Digits), OrderTakeProfit(), 0, Red);
}
} //TrailingEnd//
}
абау))) спасибо большое))) а можно как то привязать к 1 ордеру и к второму, просто у меня одновременно 2 ордера открываются на бай, и получается для первого ордера свои значения будут а для 2 и 3 ордер если 3 ордер откроется, значения будут как у второго? правильно понял?
Оооо, это уже другая история, тут надо с циклом ордеров работать, искать последний ордер, потом предпоследний.
Проще поставить дистанцию следующего ордера, например 2-ой ордер откроется на расстоянии 10-15пп от предыдущего.
Там где условия для открытия ордера надо поставить:
условия бай && MathAbs(Ask-buy_last_price)>=DistDopOrder*Point
условия селл && MathAbs(Bid-sell_last_price)>=DistDopOrder*Point
Правильно, 2-ой, 3-ий и последующие ордера будут по значениям Trailing2 работать.
Ну можно и так, ток это будет ужас в коде.
Будет тогда всё по 2 (циклы, траллы, OrderSend и модификации)
Проще найти пример цикла где определяются ордера по порядку от последнего
Что то вроде этого:
и
OrderSelect(OrdersTotal()-2,SELECT_BY_POS,MODE_TRADES) //предыдущий от последнего ордера
как я захотел сделал, но ошибка какая то в коде наверно, 1 трал нормально работает, а другой трал на определенном расстоятнии от цены всегда бегает.
extern int Trailing=10; // трейлинг для 1 типа (диапазонтрейлинга
extern int StartTrailing2=20; // трейлинг для 2 типа ордеров(кол-во пнуктов для начала)
extern int Trailing2=50; // трейлинг для 2 типа (диапазонтрейлинга
{
// Трейлинг стоп для 1 типа ордеров
double buy_last_price=-1;
double sell_last_price=-1;
for(int i=OrdersTotal()-1;i>=0;i--) if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES) && OrderSymbol()==Symbol() && OrderMagicNumber()==Magik)
{
if(OrderType()==OP_BUY) {if(buy_last_price==-1) buy_last_price=OrderOpenPrice();}
if(OrderType()==OP_SELL){if(sell_last_price==-1)sell_last_price=OrderOpenPrice();}
}
//TrailingStart//
for(i=OrdersTotal()-1;i>=0;i--) if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES) && OrderSymbol()==Symbol() && OrderMagicNumber()==Magik)
{
if(Trailing>0 && (Bid-buy_last_price)>=StartTrailing*Point && OrderType()==OP_BUY && NormalizeDouble(Bid-(Trailing+1)*Point,Digits)>NormalizeDouble(OrderStopLoss(),Digits)
&& NormalizeDouble(Bid-Trailing *Point,Digits)>=NormalizeDouble(OrderOpenPrice(),Digits))
int modify=OrderModify(OrderTicket(),OrderOpenPrice(),NormalizeDouble(Bid-Trailing *Point,Digits),OrderTakeProfit(),0,Blue);
if(Trailing>0 && (sell_last_price-Ask)>=StartTrailing*Point && OrderType()==OP_SELL && (NormalizeDouble(Ask+(Trailing+1)*Point,Digits)<NormalizeDouble(OrderStopLoss(),Digits) || OrderStopLoss()==0)
&& NormalizeDouble(Ask+Trailing *Point,Digits)<=NormalizeDouble(OrderOpenPrice(),Digits))
modify=OrderModify(OrderTicket(),OrderOpenPrice(),NormalizeDouble(Ask+Trailing *Point,Digits),OrderTakeProfit(),0,Red);
} //TrailingEnd//
}
{
// трейлинг стоп для 2 типа ордеров
double buy_last_price2=-1;
double sell_last_price2=-1;
for(i=OrdersTotal()-1;i>=0;i--) if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES) && OrderSymbol()==Symbol() && OrderMagicNumber()==Magic)
{
if(OrderType()==OP_BUY) {if(buy_last_price2==-1) buy_last_price2=OrderOpenPrice();}
if(OrderType()==OP_SELL){if(sell_last_price2==-1)sell_last_price2=OrderOpenPrice();}
}
//TrailingStart//
for(i=OrdersTotal()-1;i>=0;i--) if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES) && OrderSymbol()==Symbol() && OrderMagicNumber()==Magic)
{
if(Trailing2>0 && (Bid-buy_last_price2)>=StartTrailing2*Point && OrderType()==OP_BUY && NormalizeDouble(Bid-(Trailing2+1)*Point,Digits)>NormalizeDouble(OrderStopLoss(),Digits)
&& NormalizeDouble(Bid-Trailing2 *Point,Digits)>=NormalizeDouble(OrderOpenPrice(),Digits))
int modify2=OrderModify(OrderTicket(),OrderOpenPrice(),NormalizeDouble(Bid-Trailing2 *Point,Digits),OrderTakeProfit(),0,Blue);
if(Trailing2>0 && (sell_last_price2-Ask)>=StartTrailing2*Point && OrderType()==OP_SELL && (NormalizeDouble(Ask+(Trailing+1)*Point,Digits)<NormalizeDouble(OrderStopLoss(),Digits) || OrderStopLoss()==0)
&& NormalizeDouble(Ask+Trailing2 *Point,Digits)<=NormalizeDouble(OrderOpenPrice(),Digits))
modify2=OrderModify(OrderTicket(),OrderOpenPrice(),NormalizeDouble(Ask+Trailing2 *Point,Digits),OrderTakeProfit(),0,Red);
} //TrailingEnd//
}
extern int StartTrailing1 = 250;
extern int Trailing1 = 100;
extern int Magik1 = 1;
extern int StartTrailing2 = 150;
extern int Trailing2 = 50;
extern int Magik2 = 2;
//---------------------------------
double buy_last_price = -1;
double sell_last_price = -1;
double buy_orders = 0;
double sell_orders = 0;
for(int i=OrdersTotal()-1;i>=0;i--) if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES) && OrderSymbol()==Symbol() && OrderMagicNumber()==Magik1)
{
if(OrderType()==OP_BUY) {if(buy_last_price==-1) buy_last_price=OrderOpenPrice(); buy_orders++;}
if(OrderType()==OP_SELL){if(sell_last_price==-1)sell_last_price=OrderOpenPrice(); sell_orders++;}
}
for(int i=OrdersTotal()-1;i>=0;i--) if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES) && OrderSymbol()==Symbol() && OrderMagicNumber()==Magik2)
{
if(OrderType()==OP_BUY) {if(buy_last_price==-1) buy_last_price=OrderOpenPrice(); buy_orders++;}
if(OrderType()==OP_SELL){if(sell_last_price==-1)sell_last_price=OrderOpenPrice(); sell_orders++;}
}
//TrailingStart//
for(i=OrdersTotal()-1;i>=0;i--) if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES) && OrderSymbol()==Symbol() && OrderMagicNumber()==Magik1)
{
if (Trailing1>0 && (Bid-buy_last_price)>=StartTrailing1*Point && OrderType()==OP_BUY && NormalizeDouble(Bid-(Trailing1 +1)*Point,Digits)>NormalizeDouble(OrderStopLoss(),Digits)
&& NormalizeDouble(Bid-Trailing1 *Point,Digits)>=NormalizeDouble(OrderOpenPrice(),Digits))
int modify = OrderModify (OrderTicket(), OrderOpenPrice(), NormalizeDouble(Bid-Trailing1 *Point,Digits), OrderTakeProfit(), 0, Blue);
if (Trailing1>0 && (sell_last_price-Ask)>=StartTrailing1*Point && OrderType()==OP_SELL && (NormalizeDouble(Ask+(Trailing1 +1)*Point,Digits)<NormalizeDouble(OrderStopLoss(),Digits) || OrderStopLoss()==0)
&& NormalizeDouble(Ask+Trailing1 *Point,Digits)<=NormalizeDouble(OrderOpenPrice(),Digits))
modify = OrderModify (OrderTicket(), OrderOpenPrice(), NormalizeDouble(Ask+Trailing1 *Point,Digits), OrderTakeProfit(), 0, Red);
}
//------------------------------------------------------------+
for(i=OrdersTotal()-1;i>=0;i--) if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES) && OrderSymbol()==Symbol() && OrderMagicNumber()==Magik2)
{
if (Trailing2>0 && (Bid-buy_last_price)>=StartTrailing2*Point && OrderType()==OP_BUY && NormalizeDouble(Bid-(Trailing2 +1)*Point,Digits)>NormalizeDouble(OrderStopLoss(),Digits)
&& NormalizeDouble(Bid-Trailing2 *Point,Digits)>=NormalizeDouble(OrderOpenPrice(),Digits))
modify = OrderModify (OrderTicket(), OrderOpenPrice(), NormalizeDouble(Bid-Trailing2 *Point,Digits), OrderTakeProfit(), 0, Blue);
if (Trailing2>0 && (sell_last_price-Ask)>=StartTrailing2*Point && OrderType()==OP_SELL && (NormalizeDouble(Ask+(Trailing2 +1)*Point,Digits)<NormalizeDouble(OrderStopLoss(),Digits) || OrderStopLoss()==0)
&& NormalizeDouble(Ask+Trailing2 *Point,Digits)<=NormalizeDouble(OrderOpenPrice(),Digits))
modify = OrderModify (OrderTicket(), OrderOpenPrice(), NormalizeDouble(Ask+Trailing2 *Point,Digits), OrderTakeProfit(), 0, Red);
}
//------------------------------------------------------------------------------------|
//И добавить магик в условия для открытия ордеров
if (Условия для бай && buy_orders==0) OrderSend(OP_BUY, Lot, -, -, -, -, Magik1, -);
if (Условия для бай && buy_orders==0) OrderSend(OP_BUY, Lot, -, -, -, -, Magik2, -);
if (Условия для бай && sell_orders==0) OrderSend(OP_SELL, Lot, -, -, -, -, Magik1, -);
if (Условия для бай && sell_orders==0) OrderSend(OP_SELL, Lot, -, -, -, -, Magik2, -);
получилось!!!
Читаю эту ветку и заранее извеняюсь....о.....ю.
1.Делаем через функцию
2. далее есть два способа "А" и "Б"
А- геморойный
Б -Простой, по крайней мере для меня
Вам какой?
интересно было бы подробней узнать про А и Б, а то ж все мы тут учимся на ошибках и стараемся осуществить новые для себя идеи
Вы видимо про существование функций не слышали?
1 Функцию проще проверить
2 Удобней использовать
3 Можно передать переменные Не просто F() , а F(x) , F(x,y,z)
Так не проще?
Вы видимо про существование функций не слышали?
1 Функцию проще проверить
2 Удобней использовать
3 Можно передать переменные Не просто F() , а F(x) , F(x,y,z)
Так не проще?
могли бы пример привести, буду знать на будущее как проще!!!
жду вашего ответа
могли бы пример привести, буду знать на будущее как проще!!!
жду вашего ответа
Я сказал что мне проще. В школе учились? Не знаете что такое функция?
Математика 8 класс наверное.
Проще в функцию передать параметры чем 2 раза дублировать трейлинг.
Длина трейлинга , для примера 15 строк.
И в он тик вызываем 2 раза функцию с разными параметрами. (1 строка)
Как вы делаете фигачите 2 трейлинга по 30 строк, итого 60 строк.
Как проще?
Я сказал что мне проще. В школе учились? Не знаете что такое функция?
Математика 8 класс наверное.
Проще в функцию передать параметры чем 2 раза дублировать трейлинг.
Длина трейлинга , для примера 15 строк.
И в он тик вызываем 2 раза функцию с разными параметрами. (1 строка)
Как вы делаете фигачите 2 трейлинга по 30 строк, итого 60 строк.
Как проще?
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
Идея такая, нужно сделать так.
Открылся один ордер его тралим допустим первым трейлинг стопом с его индивидуальными параметрами, и открылась еще одна такая же позиция и ее надо тралить трелингом но уже с другими параметрами трала.
Как осущиствить???
У меня в советнике обычный трал вот такой?
//---------------------------------
double buy_last_price = -1;
double sell_last_price = -1;
for(int i=OrdersTotal()-1;i>=0;i--) if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES) && OrderSymbol()==Symbol() && OrderMagicNumber()==Magik)
{
if(OrderType()==OP_BUY) {if(buy_last_price==-1) buy_last_price=OrderOpenPrice();}
if(OrderType()==OP_SELL){if(sell_last_price==-1)sell_last_price=OrderOpenPrice();}
}
//TrailingStart//
for(i=OrdersTotal()-1;i>=0;i--) if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES) && OrderSymbol()==Symbol() && OrderMagicNumber()==Magik)
{
if (Trailing>0 && (Bid-buy_last_price)>=StartTrailing*Point && OrderType()==OP_BUY && NormalizeDouble(Bid-(Trailing +1)*Point,Digits)>NormalizeDouble(OrderStopLoss(),Digits)
&& NormalizeDouble(Bid-Trailing *Point,Digits)>=NormalizeDouble(OrderOpenPrice(),Digits))
int modify = OrderModify (OrderTicket(), OrderOpenPrice(), NormalizeDouble(Bid-Trailing *Point,Digits), OrderTakeProfit(), 0, Blue);
if (Trailing>0 && (sell_last_price-Ask)>=StartTrailing*Point && OrderType()==OP_SELL && (NormalizeDouble(Ask+(Trailing +1)*Point,Digits)<NormalizeDouble(OrderStopLoss(),Digits) || OrderStopLoss()==0)
&& NormalizeDouble(Ask+Trailing *Point,Digits)<=NormalizeDouble(OrderOpenPrice(),Digits))
modify = OrderModify (OrderTicket(), OrderOpenPrice(), NormalizeDouble(Ask+Trailing *Point,Digits), OrderTakeProfit(), 0, Red);
} //TrailingEnd//
}