for (int i=0; i<OrdersHistoryTotal(); i++)// По всем ордерам терминала if(OrderSelect(i, SELECT_BY_POS, MODE_HISTORY)==true)
после фильтрую по магическому номеру
if (OrderMagicNumber()==12)
фильтр удовлетворяет 3 позициям, а мне нужна только последняя закрытая
не могу понять как оставить только последнею?
Спасибо
//+----------------------------------------------------------------------------+//| Автор : Ким Игорь В. aka KimIV, http://www.kimiv.ru |//+----------------------------------------------------------------------------+//| Версия : 19.02.2008 |//| Описание : Возвращает номер бара закрытия последней позиции или -1. |//+----------------------------------------------------------------------------+//| Параметры: |//| sy - наименование инструмента ("" или NULL - текущий символ) |//| tf - таймфрейм ( 0 - текущий таймфрейм) |//| op - операция ( -1 - любая позиция) |//| mn - MagicNumber ( -1 - любой магик) |//+----------------------------------------------------------------------------+int NumberOfBarCloseLastPos(string sy="0", int tf=0, int op=-1, int mn=-1) {
datetime t;int i, k=OrdersHistoryTotal();
if (sy=="" || sy=="0") sy=Symbol();
for (i=0; i<k; i++) {
if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY)) {
if (OrderSymbol()==sy) {
if (OrderType()==OP_BUY || OrderType()==OP_SELL) {
if (op<0 || OrderType()==op) {
if (mn<0 || OrderMagicNumber()==mn) {
if (t<OrderCloseTime()) t=OrderCloseTime();
}
}
}
}
}
}
return(iBarShift(sy, tf, t, True));
}
{ double point =MarketInfo(Symbol(),MODE_POINT);//Запрос Point double Free=AccountFreeMargin(); double One_Lot =MarketInfo(Symbol(),MODE_MARGINREQUIRED); double Step =MarketInfo(Symbol(),MODE_LOTSTEP); double Lot =MathFloor(Free*MaxRisk/100/One_Lot/Step)*Step; int pos,total=OrdersTotal(); //----
Парни вот такой вопрос вот поступил сигнал на бай, советник пытается открыть ордер но цена меняется и вылазит ошибка неверная цена, как можно это обойти, что бы он пытался купить пока не купит ?
void CLOSEORDER(string ord)
{
for (int i=0; i<OrdersTotal(); i++)
{
if (OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==true)
{
if (OrderSymbol()!=Symbol()) continue;
if (OrderType()==OP_BUY && ord=="Buy")
OrderClose(OrderTicket(),OrderLots(),Bid,30,CLR_NONE);// Закрываем Buyif (OrderType()==OP_SELL && ord=="Sell")
OrderClose(OrderTicket(),OrderLots(),Ask,30,CLR_NONE);// Закрываем Sell
}
}
}
//--------------------------------------------------------------------void OPENORDER(string ord)
{
int error;
if (ord=="Buy" ) error=OrderSend(Symbol(),OP_BUY, LOT,Ask,20,SL,TP,"", 1,3);
if (ord=="Sell") error=OrderSend(Symbol(),OP_SELL,LOT,Bid,20,SL,TP,"",-1,3);
if (error==-1) //неудачная покупка OK
{
ShowERROR(error,0,0);
}
Остался ещё одна неприятность, встречаются участки на которых происходит только закрытие позиции, а не переворот, хотя условия для стопа и открытия новой позиции равны.
это нужно детально исследовать, такие ситуации могут возникнуть из-за того, что в эксперте условия на открытие покупки и продажи не являются взаимоисключающими. Попробуйте отследить значения нужных переменных в тестере по принципу
if(Time[0]=='время_нужного_бара') //чтоб не засорять логи берем на конкретном баре - посмотрите на картинке, где именно ошибка
{
Print("переменная=", значение);
}
Парни вот такой вопрос вот поступил сигнал на бай, советник пытается открыть ордер но цена меняется и вылазит ошибка неверная цена, как можно это обойти, что бы он пытался купить пока не купит ?
раньше стояли
я добавил 30 так как у меня 5 знак но толку нет
зацикли открытие ордера while(true), сделай проверку на 135 ошибку, потом RefreshRates(). Посмотри, в комплекте с терминалом идут скрипты с примерами, там все расписано.
это нужно детально исследовать, такие ситуации могут возникнуть из-за того, что в эксперте условия на открытие покупки и продажи не являются взаимоисключающими. Попробуйте отследить значения нужных переменных в тестере по принципу
Ок, в какую часть кода это надо вставить, как практически применить?
SergNF: То, что относится к Вашему вопросу, подчеркнул.
так выбираеться последний закрытый ордер а мне нужно последний закрытый с магиком, к примеру это строки 3,6 и 9 следовательно мне нужна 3 строка тк она последняя закрытая с магиком
Для авторизации и пользования сайтом MQL5.com необходимо разрешить использование файлов Сookie.
Пожалуйста, включите в вашем браузере данную настройку, иначе вы не сможете авторизоваться.
Вы вошли в аккаунт. Двухфакторная аутентификация отключена. Настройте её заново и отсканируйте новый QR-код или продолжите с отключённой двухфакторной аутентификацией.
Помогите решить задачу
делаю выборку по всем закрытым позициям
for (int i=0; i<OrdersHistoryTotal(); i++)// По всем ордерам терминала
if(OrderSelect(i, SELECT_BY_POS, MODE_HISTORY)==true)
после фильтрую по магическому номеру
if (OrderMagicNumber()==12)
фильтр удовлетворяет 3 позициям, а мне нужна только последняя закрытая
не могу понять как оставить только последнею?
Спасибо
повторюсь очень надо
Помогите решить задачу
делаю выборку по всем закрытым позициям
for (int i=0; i<OrdersHistoryTotal(); i++)// По всем ордерам терминала
if(OrderSelect(i, SELECT_BY_POS, MODE_HISTORY)==true)
после фильтрую по магическому номеру
if (OrderMagicNumber()==12)
фильтр удовлетворяет 3 позициям, а мне нужна только последняя закрытая
не могу понять как оставить только последнею?
Спасибо
Помогите пожалуйста! Нужно чтоб Ордер открывался сразу после закрытия старого, по цене Tp или SL
#property copyright "Copyright © 2010, MetaQuotes Software Corp."
#property link "http://www.metaquotes.net"
#property show_confirm
extern int MaxRisk=3;
extern bool Buy=false; //для открытия ордера на покупку
extern bool Sell=true; //для открытия ордера на продажу
extern int MagicNumber=7749;
extern int TP=210;
extern int SL=420;
{
double point =MarketInfo(Symbol(),MODE_POINT);//Запрос Point
double Free=AccountFreeMargin();
double One_Lot =MarketInfo(Symbol(),MODE_MARGINREQUIRED);
double Step =MarketInfo(Symbol(),MODE_LOTSTEP);
double Lot =MathFloor(Free*MaxRisk/100/One_Lot/Step)*Step;
int pos,total=OrdersTotal();
//----
if(Buy==true && OrdersTotal()<=1)
{
OrderSend(Symbol(),OP_BUY,Lot,Ask,3,Ask-SL*Point,Ask+TP*Point,"777"+ Symbol(), MagicNumber, 0, DarkGreen);
Buy=false;
}
if(Sell==true && OrdersTotal()<=1)
{
OrderSend(Symbol(),OP_SELL,Lot,Bid,3,Bid+SL*Point,Bid-TP*Point,"4949"+ Symbol(), MagicNumber, 0, DarkGreen);
Sell=false;
}
for (pos=0; pos<total; pos++)
if(OrderSelect(pos,SELECT_BY_POS )==true)
if(OrdersTotal()==OP_BUY)
if(PRICE_CLOSE==OrderTakeProfit()) Buy=true;
if(PRICE_CLOSE==OrderStopLoss()) Sell=true;
}
}
if (OrderSelect(pos,SELECT_BY_POS )==true)
if (OrdersTotal()==OP_SELL)
{
if(PRICE_CLOSE==OrderStopLoss()) Buy=true;
if(PRICE_CLOSE==OrderTakeProfit()) Sell=true;
}
} }
//----
return(0);
}
//+------------------------------------------------------------------+
Парни вот такой вопрос вот поступил сигнал на бай, советник пытается открыть ордер но цена меняется и вылазит ошибка неверная цена, как можно это обойти, что бы он пытался купить пока не купит ?
раньше стояли
я добавил 30 так как у меня 5 знак но толку нет
повторюсь очень надо
Помогите решить задачу
делаю выборку по всем закрытым позициям
Начни с конца, тогда первая подходящая и есть та самая.
for (int i=OrdersHistoryTotal()-1;i>=0; i--)//
if(OrderSelect(i, SELECT_BY_POS, MODE_HISTORY)==true)
Остался ещё одна неприятность, встречаются участки на которых происходит только закрытие позиции, а не переворот, хотя условия для стопа и открытия новой позиции равны.
это нужно детально исследовать, такие ситуации могут возникнуть из-за того, что в эксперте условия на открытие покупки и продажи не являются взаимоисключающими. Попробуйте отследить значения нужных переменных в тестере по принципу
if(Time[0]=='время_нужного_бара') //чтоб не засорять логи берем на конкретном баре - посмотрите на картинке, где именно ошибка { Print("переменная=", значение); }Парни вот такой вопрос вот поступил сигнал на бай, советник пытается открыть ордер но цена меняется и вылазит ошибка неверная цена, как можно это обойти, что бы он пытался купить пока не купит ?
раньше стояли
я добавил 30 так как у меня 5 знак но толку нет
это нужно детально исследовать, такие ситуации могут возникнуть из-за того, что в эксперте условия на открытие покупки и продажи не являются взаимоисключающими. Попробуйте отследить значения нужных переменных в тестере по принципу
То, что относится к Вашему вопросу, подчеркнул.