Прошу помощи у профов написал код для трейлинга в MQL4 но почему-то на Buy работает а на Sell нет
Прошу помощи у профов написал код для трейлинга в MQL4 но почему-то на Buy работает а на Sell нет:
{Orders=OrderSelect(ordertreiling,SELECT_BY_POS,MODE_TRADES)==true;//выбор ордера
Ticket_ordera_TRSTOP=OrderTicket();
if ((OrderType()==OP_SELL)&&(Ask<(OrderOpenPrice()-NormalizeDouble(TR_otstup*Point,5))&&((TrallStopLoss_Ask>(Ask+NormalizeDouble(Point*TR_otstup,5)))||(TrallStopLoss_Ask==0))))
{
TrallStopLoss_Ask=Ask+Point*TR_otstup;
Orders=OrderModify(Ticket_ordera_TRSTOP,OrderOpenPrice(),(Ask+NormalizeDouble(Point*TR_otstup,5)),OrderTakeProfit(),0,clrDarkViolet);
Print ("ошибка трейлинга- "+GetLastError());
}
if ((OrderType()==OP_BUY)&&(Bid>(OrderOpenPrice()+NormalizeDouble(TR_otstup*Point,5)))&&(TrallStopLoss_Bid<(Bid-NormalizeDouble(Point*TR_otstup,5))))
{
TrallStopLoss_Bid=Bid-Point*TR_otstup;
Orders=OrderModify(Ticket_ordera_TRSTOP,OrderOpenPrice(),(Bid-NormalizeDouble(Point*TR_otstup,5)),OrderTakeProfit(),0,clrDarkViolet);
Print ("ошибка трейлинга- "+GetLastError());
}
}
подскажите в чем прикол а то я уже голову сломал!!!
Возможно тут всегда "false"
Тут всегда "true", потому и OP_BUY OrderModify() вызывается
Сложно стилизатором воспользоваться? (Ctrl+ , )
Можете воспользоваться моим кодом с некоторой доработкой под себя.
void GOrders::trailing_simple(double level,double doffset,double dstep=0,int itype=ALL)
{
double st,stop=0,dStep=dstep;
int flag;
if(level==0.0) return;
for(int i=OrdersTotal()-1;i>=0;i--)
{
if(!OrderSelect(i,SELECT_BY_POS)) continue;
if(OrderType()>=2) continue;
if((OrderSymbol()==sname || sname==NULL) && (OrderMagicNumber()==imagic || imagic==-1))
{
string n=OrderSymbol();
double tick=MarketInfo(n,MODE_TICKSIZE);
if(dStep==0) dStep=tick/p;
stop=OrderStopLoss();
if(bvirtual) stop=virtual_get_sl(OrderTicket());
double pt=0;
flag=toMyTypes(OrderType())&itype;
if(OrderType()==OP_BUY && OrderType()==toDefType(flag,itype))
{
pt=(dBid(n)-OrderOpenPrice())/p;
// Print("buy pt=",pt);
st=NormalizeDouble(MathFloor((dBid(n)-MathAbs(doffset)*p)/tick)*tick,(int)dDigits(n));
if(pt>=level && level!=0.0)
{
if(stop==0 || (stop<st && (st-stop)/p>=dStep))
{
if(bvirtual) virtual_set(OrderTicket(),st,-1);
else OrderModify(OrderTicket(),-1,st,-1,0,clrNONE);
continue;
}
}
}
if(OrderType()==OP_SELL && OrderType()==toDefType(flag,itype))
{
pt=(OrderOpenPrice()-dAsk(n))/p;
st=NormalizeDouble(MathFloor((dAsk(n)+MathAbs(doffset)*p)/tick)*tick,(int)dDigits(n));
if(pt>=level && level!=0)
{
if(stop==0 || (stop>st && (stop-st)/p>=dStep))
{
if(bvirtual) virtual_set(OrderTicket(),st,-1);
else OrderModify(OrderTicket(),-1,st,-1,0,clrNONE);
continue;
}
}
}
}
}
}
Сложно стилизатором воспользоваться? (Ctrl+ , )
Можете воспользоваться моим кодом с некоторой доработкой под себя.
Сколько в среднем бывает OrderMagicNumber() и сколько OrderSymbol()?
Лучше ордера сортировать так:
//| |
//+------------------------------------------------------------------+
for(int cnt=OrdersTotal()-1;cnt>=0;cnt--)
{
if(!OrderSelect(cnt,SELECT_BY_POS,MODE_TRADES))
continue;
if(OrderType()>OP_SELL)
continue;
if(OrderMagicNumber()!=MagicIdentifier)
continue;
if(OrderSymbol()!=sYmbol)
continue;
//Исполняемый код
}
//+------------------------------------------------------------------+
Сложно стилизатором воспользоваться? (Ctrl+ , )
Можете воспользоваться моим кодом с некоторой доработкой под себя.
void GOrders::trailing_simple(double level,double doffset,double dstep=0,int itype=ALL)
{
double st,stop=0,dStep=dstep;
int flag;
if(level==0.0) return;
for(int i=OrdersTotal()-1;i>=0;i--)
{
if(!OrderSelect(i,SELECT_BY_POS)) continue;
if(OrderType()>=2) continue;
if((OrderSymbol()==sname || sname==NULL) && (OrderMagicNumber()==imagic || imagic==-1))
{
string n=OrderSymbol();
double tick=MarketInfo(n,MODE_TICKSIZE);
if(dStep==0) dStep=tick/p;
stop=OrderStopLoss();
if(bvirtual) stop=virtual_get_sl(OrderTicket());
double pt=0;
flag=toMyTypes(OrderType())&itype;
if(OrderType()==OP_BUY && OrderType()==toDefType(flag,itype))
{
pt=(dBid(n)-OrderOpenPrice())/p;
// Print("buy pt=",pt);
st=NormalizeDouble(MathFloor((dBid(n)-MathAbs(doffset)*p)/tick)*tick,(int)dDigits(n));
if(pt>=level && level!=0.0)
{
if(stop==0 || (stop<st && (st-stop)/p>=dStep))
{
if(bvirtual) virtual_set(OrderTicket(),st,-1);
else OrderModify(OrderTicket(),-1,st,-1,0,clrNONE);
continue;
}
}
}
if(OrderType()==OP_SELL && OrderType()==toDefType(flag,itype))
{
pt=(OrderOpenPrice()-dAsk(n))/p;
st=NormalizeDouble(MathFloor((dAsk(n)+MathAbs(doffset)*p)/tick)*tick,(int)dDigits(n));
if(pt>=level && level!=0)
{
if(stop==0 || (stop>st && (stop-st)/p>=dStep))
{
if(bvirtual) virtual_set(OrderTicket(),st,-1);
else OrderModify(OrderTicket(),-1,st,-1,0,clrNONE);
continue;
}
}
}
}
}
}
Вы бы сначала прочитали про
Возможно тут всегда "false"
Тут всегда "true", потому и OP_BUY OrderModify() вызывается
Вы бы сначала прочитали про
Возможно тут всегда "false"
Тут всегда "true", потому и OP_BUY OrderModify() вызывается
Прошу помощи у профов написал код для трейлинга в MQL4 но почему-то на Buy работает а на Sell нет:
{Orders=OrderSelect(ordertreiling,SELECT_BY_POS,MODE_TRADES)==true;//выбор ордера
Ticket_ordera_TRSTOP=OrderTicket();
if ((OrderType()==OP_SELL)&&(Ask<(OrderOpenPrice()-NormalizeDouble(TR_otstup*Point,5))&&((TrallStopLoss_Ask>(Ask+NormalizeDouble(Point*TR_otstup,5)))||(TrallStopLoss_Ask==0))))
{
TrallStopLoss_Ask=Ask+Point*TR_otstup;
Orders=OrderModify(Ticket_ordera_TRSTOP,OrderOpenPrice(),(Ask+NormalizeDouble(Point*TR_otstup,5)),OrderTakeProfit(),0,clrDarkViolet);
Print ("ошибка трейлинга- "+GetLastError());
}
if ((OrderType()==OP_BUY)&&(Bid>(OrderOpenPrice()+NormalizeDouble(TR_otstup*Point,5)))&&(TrallStopLoss_Bid<(Bid-NormalizeDouble(Point*TR_otstup,5))))
{
TrallStopLoss_Bid=Bid-Point*TR_otstup;
Orders=OrderModify(Ticket_ordera_TRSTOP,OrderOpenPrice(),(Bid-NormalizeDouble(Point*TR_otstup,5)),OrderTakeProfit(),0,clrDarkViolet);
Print ("ошибка трейлинга- "+GetLastError());
}
}
подскажите в чем прикол а то я уже голову сломал!!!
Проверьте так:
{
for(int cnt=OrdersTotal()-1;cnt>=0;cnt--)
{
if(!OrderSelect(cnt,SELECT_BY_POS,MODE_TRADES))
continue;
if(OrderType()>OP_SELL)
continue;
Ticket_ordera_TRSTOP=OrderTicket();
if((OrderType()==OP_SELL) && (Ask<(OrderOpenPrice()-MathMax(NormalizeDouble(TR_otstup*Point,5),NormalizeDouble((Ask-Bid)*2.0,5)))))// && ((TrallStopLoss_Ask>(Ask+NormalizeDouble(Point*TR_otstup,5))) || (TrallStopLoss_Ask==0))
{
TrallStopLoss_Ask=Ask+Point*TR_otstup;
Orders=OrderModify(Ticket_ordera_TRSTOP,OrderOpenPrice(),MathMax(Ask+NormalizeDouble(Point*TR_otstup,5),Ask+NormalizeDouble((Ask-Bid),5)),OrderTakeProfit(),0,clrDarkViolet);
if(!Orders)
Print("ошибка трейлинга- "+GetLastError());
}
if((OrderType()==OP_BUY) && (Bid>(OrderOpenPrice()+NormalizeDouble(TR_otstup*Point,5))) && (TrallStopLoss_Bid<(Bid-NormalizeDouble(Point*TR_otstup,5))))
{
TrallStopLoss_Bid=Bid-Point*TR_otstup;
Orders=OrderModify(Ticket_ordera_TRSTOP,OrderOpenPrice(),(Bid-NormalizeDouble(Point*TR_otstup,5)),OrderTakeProfit(),0,clrDarkViolet);
if(!Orders)
Print("ошибка трейлинга- "+GetLastError());
}
}
}
при выборе ордера ошибка, напиши так:
for(int i=0; i<OrdersTotal(); i++)
{
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
{
{
Orders=OrderSelect(ordertreiling,SELECT_BY_POS,MODE_TRADES)==true;//выбор ордера
Ticket_ordera_TRSTOP=OrderTicket();
if((OrderType()==OP_SELL) && (Ask<(OrderOpenPrice()-NormalizeDouble(TR_otstup*Point,5)) && ((TrallStopLoss_Ask>(Ask+NormalizeDouble(Point*TR_otstup,5))) || (TrallStopLoss_Ask==0))))
{
TrallStopLoss_Ask=Ask+Point*TR_otstup;
Orders=OrderModify(Ticket_ordera_TRSTOP,OrderOpenPrice(),(Ask+NormalizeDouble(Point*TR_otstup,5)),OrderTakeProfit(),0,clrDarkViolet);
Print("ошибка трейлинга- "+GetLastError());
}
if((OrderType()==OP_BUY) && (Bid>(OrderOpenPrice()+NormalizeDouble(TR_otstup*Point,5))) && (TrallStopLoss_Bid<(Bid-NormalizeDouble(Point*TR_otstup,5))))
{
TrallStopLoss_Bid=Bid-Point*TR_otstup;
Orders=OrderModify(Ticket_ordera_TRSTOP,OrderOpenPrice(),(Bid-NormalizeDouble(Point*TR_otstup,5)),OrderTakeProfit(),0,clrDarkViolet);
Print("ошибка трейлинга- "+GetLastError());
}
}
}
при выборе ордера ошибка, напиши так:
for(int i=0; i<OrdersTotal(); i++)
{
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
{
{
Orders=OrderSelect(ordertreiling,SELECT_BY_POS,MODE_TRADES)==true;//выбор ордера
Ticket_ordera_TRSTOP=OrderTicket();
if((OrderType()==OP_SELL) && (Ask<(OrderOpenPrice()-NormalizeDouble(TR_otstup*Point,5)) && ((TrallStopLoss_Ask>(Ask+NormalizeDouble(Point*TR_otstup,5))) || (TrallStopLoss_Ask==0))))
{
TrallStopLoss_Ask=Ask+Point*TR_otstup;
Orders=OrderModify(Ticket_ordera_TRSTOP,OrderOpenPrice(),(Ask+NormalizeDouble(Point*TR_otstup,5)),OrderTakeProfit(),0,clrDarkViolet);
Print("ошибка трейлинга- "+GetLastError());
}
if((OrderType()==OP_BUY) && (Bid>(OrderOpenPrice()+NormalizeDouble(TR_otstup*Point,5))) && (TrallStopLoss_Bid<(Bid-NormalizeDouble(Point*TR_otstup,5))))
{
TrallStopLoss_Bid=Bid-Point*TR_otstup;
Orders=OrderModify(Ticket_ordera_TRSTOP,OrderOpenPrice(),(Bid-NormalizeDouble(Point*TR_otstup,5)),OrderTakeProfit(),0,clrDarkViolet);
Print("ошибка трейлинга- "+GetLastError());
}
}
}
при выборе ордера ошибка, напиши так:
for(int i=0; i<OrdersTotal(); i++)
{
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
{
{
Orders=OrderSelect(ordertreiling,SELECT_BY_POS,MODE_TRADES)==true;//выбор ордера
Ticket_ordera_TRSTOP=OrderTicket();
if((OrderType()==OP_SELL) && (Ask<(OrderOpenPrice()-NormalizeDouble(TR_otstup*Point,5)) && ((TrallStopLoss_Ask>(Ask+NormalizeDouble(Point*TR_otstup,5))) || (TrallStopLoss_Ask==0))))
{
TrallStopLoss_Ask=Ask+Point*TR_otstup;
Orders=OrderModify(Ticket_ordera_TRSTOP,OrderOpenPrice(),(Ask+NormalizeDouble(Point*TR_otstup,5)),OrderTakeProfit(),0,clrDarkViolet);
Print("ошибка трейлинга- "+GetLastError());
}
if((OrderType()==OP_BUY) && (Bid>(OrderOpenPrice()+NormalizeDouble(TR_otstup*Point,5))) && (TrallStopLoss_Bid<(Bid-NormalizeDouble(Point*TR_otstup,5))))
{
TrallStopLoss_Bid=Bid-Point*TR_otstup;
Orders=OrderModify(Ticket_ordera_TRSTOP,OrderOpenPrice(),(Bid-NormalizeDouble(Point*TR_otstup,5)),OrderTakeProfit(),0,clrDarkViolet);
Print("ошибка трейлинга- "+GetLastError());
}
}
}
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
Прошу помощи у профов написал код для трейлинга в MQL4 но почему-то на Buy работает а на Sell нет:
{Orders=OrderSelect(ordertreiling,SELECT_BY_POS,MODE_TRADES)==true;//выбор ордера
Ticket_ordera_TRSTOP=OrderTicket();
if ((OrderType()==OP_SELL)&&(Ask<(OrderOpenPrice()-NormalizeDouble(TR_otstup*Point,5))&&((TrallStopLoss_Ask>(Ask+NormalizeDouble(Point*TR_otstup,5)))||(TrallStopLoss_Ask==0))))
{
TrallStopLoss_Ask=Ask+Point*TR_otstup;
Orders=OrderModify(Ticket_ordera_TRSTOP,OrderOpenPrice(),(Ask+NormalizeDouble(Point*TR_otstup,5)),OrderTakeProfit(),0,clrDarkViolet);
Print ("ошибка трейлинга- "+GetLastError());
}
if ((OrderType()==OP_BUY)&&(Bid>(OrderOpenPrice()+NormalizeDouble(TR_otstup*Point,5)))&&(TrallStopLoss_Bid<(Bid-NormalizeDouble(Point*TR_otstup,5))))
{
TrallStopLoss_Bid=Bid-Point*TR_otstup;
Orders=OrderModify(Ticket_ordera_TRSTOP,OrderOpenPrice(),(Bid-NormalizeDouble(Point*TR_otstup,5)),OrderTakeProfit(),0,clrDarkViolet);
Print ("ошибка трейлинга- "+GetLastError());
}
}
подскажите в чем прикол а то я уже голову сломал!!!