Что то и в этот раз робот пропускает профит. Может я что то не так делаю? Это что касается брокера на букву Б. У брокера на букву О и без "рыбы" все нормально.
Что делать?
Код:
//+------------------------------------------------------------------+//| LastPrice.mq5 |//| Copyright 2015, MetaQuotes Software Corp. |//| https://www.mql5.com |//+------------------------------------------------------------------+#property copyright"Copyright 2015, MetaQuotes Software Corp."#property link"https://www.mql5.com"#property version"1.00"inputdouble interval=100; //Мин. отклонение цены сделкиinputdouble Lots=1; //Лотinputint SlPips=100; //Stop LossinputENUM_ORDER_TYPE_FILLING Filling=ORDER_FILLING_RETURN; //Режим заполнения ордера#include <trade/trade.mqh>
int tradeResult=0;
double tradePrice=0,LastPrice=0;
//+------------------------------------------------------------------+//| Expert initialization function |//+------------------------------------------------------------------+intOnInit()
{
if(!MarketBookAdd(_Symbol))
{
MessageBox("Не добавлен стакан по символу "+_Symbol);
return( INIT_FAILED );
}
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+//| Expert deinitialization function |//+------------------------------------------------------------------+voidOnDeinit(constint reason)
{
MarketBookRelease(_Symbol);
}
//+------------------------------------------------------------------+//| Get Stakan values function |//+------------------------------------------------------------------+ bool GetStakanValues(conststring aSymbol,double &ask,double &bid)
{
MqlBookInfo book_price[];
bid = 0;
ask = DBL_MAX;
//--- Get stakanif(MarketBookGet(aSymbol,book_price))
{
int size=ArraySize(book_price);
//--- if(size>0)
{
for(int i=0; i<size; i++)
{
if(book_price[i].type==BOOK_TYPE_SELL)
{
if(book_price[i].price<ask)
{
ask=book_price[i].price;
}
}
elseif(book_price[i].type==BOOK_TYPE_BUY)
{
bid=book_price[i].price;
return( true );
}
}
}
}
//---if(ask==DBL_MAX) ask=0;
return( false);
}
//+------------------------------------------------------------------+//| BookEvent function |//+------------------------------------------------------------------+voidOnBookEvent(conststring &symbol)
{
if(symbol==_Symbol)
{
double ask,bid;
//--- if(GetStakanValues(_Symbol,ask,bid))
{
double last=SymbolInfoDouble(_Symbol,SYMBOL_LAST);
///ROBOT++++++++++++++++++++++++++++++++++++++++++++++++///BUYif(tradeResult==0)
if(last>=ask+interval)
{
MqlTradeRequest request={0};
MqlTradeResult result={0};
double spread = MathAbs(ask-bid);
request.action=TRADE_ACTION_PENDING; // setting a pending order
request.magic=68975; // ORDER_MAGIC
request.symbol=_Symbol; // symbol
request.volume=Lots; // volume in 0.1 lots
request.sl=ask-SlPips; // Stop Loss is not specified//request.tp=NormalizeDouble(ask + TpPips * gTickSize, _Digits); // Take Profit is not specified
request.type=ORDER_TYPE_BUY_LIMIT; // order type
request.price=ask; // open price
request.type_filling=Filling;
request.deviation=0;
request.type_time=ORDER_TIME_DAY;
request.expiration=0;
//--- send a trade requestint i=PositionsTotal();//Wait openedPosition
tradePrice=ask;
if(OrderSend(request,result))
{
while(i==PositionsTotal())//Wait openedPosition
{
GetStakanValues(_Symbol,ask,bid);//Close freezy orderif(ask!=tradePrice)
{
CTrade trade;
trade.SetTypeFilling(Filling);
trade.OrderDelete(OrderGetTicket(0));
if(OrdersTotal()==0) break;
}
}
if(PositionSelect(_Symbol)) tradeResult=1;
LastPrice=last;
}
}
//////SELLif(tradeResult==0)
if(last<=bid-interval)
{
MqlTradeRequest request={0};
MqlTradeResult result={0};
request.action=TRADE_ACTION_PENDING; // setting a pending order
request.magic=68975; // ORDER_MAGIC
request.symbol=_Symbol; // symbol
request.volume=Lots; // volume in 0.1 lots
request.sl=bid+SlPips; // Stop Loss is not specified//request.tp=NormalizeDouble(bid - TpPips * gTickSize, _Digits); // Take Profit is not specified
request.type=ORDER_TYPE_SELL_LIMIT; // order type
request.price=bid; // open price
request.type_filling=Filling;
request.deviation=0;
request.type_time=ORDER_TIME_DAY;
request.expiration=0; //--- send a trade requestint i=PositionsTotal();//Wait openedPosition
tradePrice=bid;
if(OrderSend(request,result))
{
while(i==PositionsTotal())//Wait openedPosition
{
GetStakanValues(_Symbol,ask,bid);//Close freezy orderif(bid!=tradePrice)
{
CTrade trade;
trade.SetTypeFilling(Filling);
trade.OrderDelete(OrderGetTicket(0));
}
if(OrdersTotal()==0) break;
}
if(PositionSelect(_Symbol)) tradeResult=2;
LastPrice=last;
}
}
///ClosePositionif(tradeResult==2) ///if SELL positionif(((LastPrice>=ask || LastPrice>=bid) && (tradePrice>=ask)) || (tradePrice>ask))
{
CTrade trade;
trade.SetTypeFilling(Filling);
int i=PositionsTotal()-1;
while(i>=0)
{
if(trade.PositionClose(_Symbol)) i--;
}
tradeResult=0;
}
if(tradeResult==1) ///if BUY positionif(((LastPrice<=bid || LastPrice<=ask) && (tradePrice<=bid)) || (tradePrice<bid))
{
CTrade trade;
trade.SetTypeFilling(Filling);
int i=PositionsTotal()-1;
while(i>=0)
{
if(trade.PositionClose(_Symbol)) i--;
}
tradeResult=0;
}
//////PositionSLif(tradeResult!=0)
if(!PositionSelect(_Symbol))
tradeResult=0;
//////ROBOT++++++++++++++++++++++++++++++++++++++++++++++++
}
}
}
//+------------------------------------------------------------------+
Для авторизации и пользования сайтом MQL5.com необходимо разрешить использование файлов Сookie.
Пожалуйста, включите в вашем браузере данную настройку, иначе вы не сможете авторизоваться.
Вы вошли в аккаунт. Двухфакторная аутентификация отключена. Настройте её заново и отсканируйте новый QR-код или продолжите с отключённой двухфакторной аутентификацией.
Зачем Вы ещё раз берёте
Если в структуре MqlTick уже есть эти данные?
А это
Ни "в какие ворота"!
last - double, ask -double, а interval - int !!!
Не используйте для ФОРТС стандартную библиотеку.
И на ФОРТС лучше использовать стаканы, нежели OnTick()
Вот "рыба":
А где мне получать цену Last в OnBookEvent или в OnTick? И как?
Что то и в этот раз робот пропускает профит. Может я что то не так делаю? Это что касается брокера на букву Б. У брокера на букву О и без "рыбы" все нормально.
Что делать?
Код:
1. Вам же уже рекомендовали не использовать стандартную
библиотеку.
2. Нужно использовать PositionSelect()
Зачем спрашивать, если Вы игнорируете советы?
И ещё...
Интервал Вы указываете не правильно, потому что это абсолютная величина,
никак не привязанная к цене тика.
Поэтому рекомендую само значение указывать в пунктах (long), а когда
сравниваете использовать эту функцию:
1. Вам же уже рекомендовали не использовать стандартную
библиотеку.
Что за библиотека? Я и так использую букэвент.
ПС Посмотрите мой предыдущий комментария - там я представил исправленный код.
Что за библиотека? Я и так использую букэвент.
ПС Посмотрите мой предыдущий комментария - там я представил исправленный код.
#include <trade/trade.mqh>У Вас очень простой советник.
Гораздо разумнее использовать так:
Вот Вам в помощь, а дальше сами:
{ return( true ); } } else { Print( " Order not set!"); } return( false ); } //+------------------------------------------------------------------+ //| Expert Points to price function | //+------------------------------------------------------------------+ double PointsToPrice( const long a_points ) { double step_price = SymbolInfoDouble( _Symbol, SYMBOL_TRADE_TICK_SIZE ); double a_price = ( double( a_points ) * _Point ) / step_price; if ( a_points < 0 ) { a_price = MathFloor( a_price ) * step_price; } else { a_price = MathCeil( a_price ) * step_price; } return( NormalizeDouble( a_price, _Digits ) ); } //+------------------------------------------------------------------+Помните, что установив ОТЛОЖЕННЫЙ ордер ( ORDER_FILLING_RETURN )
У Вас может быть и действующий ордер и открытая позиция.
Для проверки существования ордера, вам понадобится его тикет (result.order)
А вообще, если честно (не обижайтесь) Вы пишите обыкновенный сливатор.
Почитайте про арбитражные стратегии, парный трейдинг и т.п
На это уйдёт много времени (пока разберётесь), но зато будете ЗАРАБАТЫВАТЬ.