в учебнике по MQLв главе Стандартные функции в разделе Операции с графиками приведена функция WindowHandle со следующим описанием: "… возвращает системный дескриптор окна (window handle), содержащего указанный график".
Вопрос: что означает (что такое) "системный дескриптор окна" и для чего он нужен?
P.S. Чтобы не захламлять форум, заранее благодарю за ответ
в учебнике по MQLв главе Стандартные функции в разделе Операции с графиками приведена функция WindowHandle со следующим описанием: "… возвращает системный дескриптор окна (window handle), содержащего указанный график".
Вопрос: что означает (что такое) "системный дескриптор окна" и для чего он нужен?
P.S. Чтобы не захламлять форум, заранее благодарю за ответ
Ответ:
дескриптор окна - это число
дескриптор окна нужен для последующей работы с окном
здравствуйте! проблема с кодам!!! мне нужно чтобы ордера открывались по очереди sell, bay, sell и т.д. но чтобы подсчет велся в течений дня, на следующий день по новому, не учитывая последовательность открытия ордеров предыдущего дня! то есть новый день новый цикл! выше код я думаю, что это примерно так должно выглядеть! только вот советник не открывает ни одного ордера! не могу понять в чем дела...подскажите если знаете!!
Так при открытие отложенного ордера задайте время истечения отложенного ордера, скажем 23:59, он сам и закроется.
nt OrderSend( string symbol, int cmd, double volume, double price, int slippage, double stoploss, double takeprofit, string comment=NULL, int magic=0, datetime expiration=0, color arrow_color=CLR_NONE)
здравствуйте! проблема с кодам!!! мне нужно чтобы ордера открывались по очереди sell, bay, sell и т.д. но чтобы подсчет велся в течений дня, на следующий день по новому, не учитывая последовательность открытия ордеров предыдущего дня! то есть новый день новый цикл! выше код я думаю, что это примерно так должно выглядеть! только вот советник не открывает ни одного ордера! не могу понять в чем дела...подскажите если знаете!!
А почему он должен открывать ордера, особенно если в история пустая. И научитесь код вставлять по человечески, мне не нравится редактировать чужие посты.
Здравствуйте! Меня вот волнует один вопрос по индикаторам на MQL4, и никак не могу до конца понять... Например, есть несложный индикатор фракталов:
//+===========================================================================+ //| FRAC.mq4 | //+===========================================================================+ // Параметры: // // По умолчанию frac_5 - оранжевый, frac_3 - темно-синий. //----- // History - определяет на сколько глубоко в историю вам нужно отображение // индикатора (в количестве свечей). Минимальное значение = 2. //----- // frac_3 - если значение "on", то frac_3 отображается, иначе нет. //----- // frac_5 - если значение "on", то frac_5 отображается, иначе нет. //+===========================================================================+ #property indicator_chart_window #property indicator_buffers 4#property indicator_color1 MidnightBlue #property indicator_color2 MidnightBlue #property indicator_color3 Orange #property indicator_color4 Orange //----- externint history = 500;
externstring frac_3 = "on";
externstring frac_5 = "on";
externint metka = 20;
//----- double FRAC_3_POS[];
double FRAC_3_NEG[];
double FRAC_5_POS[];
double FRAC_5_NEG[];
//+===========================================================================+ int init()
{
SetIndexBuffer (0, FRAC_3_POS);
SetIndexStyle (0, DRAW_ARROW, 0, 3);
SetIndexArrow (0, 217);
//----- SetIndexBuffer (1, FRAC_3_NEG);
SetIndexStyle (1, DRAW_ARROW, 0, 3);
SetIndexArrow (1, 218);
//----- SetIndexBuffer (2, FRAC_5_POS);
SetIndexStyle (2, DRAW_ARROW, 0, 3);
SetIndexArrow (2, 217);
//----- SetIndexBuffer (3, FRAC_5_NEG);
SetIndexStyle (3, DRAW_ARROW, 0, 3);
SetIndexArrow (3, 218);
return(0);
}
//+===========================================================================+ int start()
{
int i,Counted_bars;
Counted_bars = IndicatorCounted();
i = Bars - Counted_bars - 1;
if (history < 2)
history = 2;
if (i > history - 1)
i = history - 1;
//i=Bars - 1;//----- if (Digits <= 3)
double K = 0.01;
else K = 0.0001;
while (i >= 0)
{
double FR_3P=0, FR_3N=0,
FR_5P=0, FR_5N=0;
//----- if (High[i+1] >= High[i+2] && High[i+1] >= High[i])
FR_3P = High[i+1] + metka*K;
//----- if (Low[i+1] <= Low[i+2] && Low[i+1] <= Low[i])
FR_3N = Low[i+1] - metka*K;
//----- if (High[i+2] >= High[i+4] && High[i+2] >= High[i+3] && High[i+2] >= High[i+1] && High[i+2] >= High[i])
FR_5P = High[i+2] + metka*K;
//----- if (Low[i+2] <= Low[i+4] && Low[i+2] <= Low[i+3] && Low[i+2] <= Low[i+1] && Low[i+2] <= Low[i])
FR_5N = Low[i+2] - metka*K;
//----- if (frac_3 != "on")
{
FR_3P = EMPTY;
FR_3N = EMPTY;
}
//----- if (frac_5 != "on")
{
FR_5P = EMPTY;
FR_5N = EMPTY;
}
//-----
FRAC_3_POS[i+1] = FR_3P;
FRAC_3_NEG[i+1] = FR_3N;
FRAC_5_POS[i+2] = FR_5P;
FRAC_5_NEG[i+2] = FR_5N;
i--;
}
return(0);
}
//+===========================================================================+
Если его компилировать в этом виде, то при расширении левой границы графика и подгрузке истории он начинает глючить и показывать метки там, где их быть не должно (см. скрин во вложении). Если закомментировать часть кода:
if (history < 2)
history = 2;
if (i > history - 1)
i = history - 1;
То такие глюки исчезают... эти же глюки появляются при подгрузке истории, если заполнять только "непустые" элементы индикаторного массива и не обнулять значение индикатора там, где метки нет...
Почему это происходит? Почему, получается, обязательно надо при подгрузке истории пересчитывать весь индикатор? И почему надо обнулять значения "пустых" элементов инд. массива?
Если бы бары индексировались слева направо, то при подгрузке истории индексы баров сменялись бы и индикатор без перерасчёта отображался бы неверно, тогда был бы понятен такой глюк... Но ведь в МТ4 бары индексируются справа налево, значит, при подгрузке истории, индексы тех баров, которые были, должны были остаться теми же (и значения индикатора тоже), тогда зачем перерасчитывать индикатор и откуда берутся эти сдвиги меток?
Коллеги подскажите ответ на следующий вопрос. Открываю руками 4 ордера на бай, запускаю советник который удаляет установленные ордера по цене бид, проскальзывание поставил 100 пунктов, удаление в цикле, проверка занятости потока и обновление котировок присутствует. Почему ордера не удаляются в цикле все ? по логу видно что удаление идёт за несколько инициализаций функции start() код советника
int start()
{
Print("Пришёл новый тик");
int total=OrdersTotal();
Print("Всего ордеров = "+total);
for (int i=0;i<total;i++)
if (OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
{
//Print("Всего ордеров = "+OrdersTotal());Print("удаляем ордер = "+i+" тикет ордера = "+OrderTicket());
while(IsTradeContextBusy())
{
Print("Торговый поток занят");
Sleep(100);
}
RefreshRates();
OrderClose(OrderTicket(),OrderLots(),Bid,100,0);
Print("ошибка="+GetLastError());
}
return(0);
}
вот лог советника:
17:16:59 temp EURUSD,M1: loaded successfully 17:17:51 temp EURUSD,M1: Пришёл новый тик 17:17:51 temp EURUSD,M1: Всего ордеров = 4 17:17:51 temp EURUSD,M1: удаляем ордер = 0 тикет ордера = 2808657 17:17:52 temp EURUSD,M1: close #2808657 buy 1.00 EURUSD at 1.28969 at price 1.28973 17:17:52 temp EURUSD,M1: ошибка=0 17:17:52 temp EURUSD,M1: удаляем ордер = 1 тикет ордера = 2808659 17:17:52 temp EURUSD,M1: close #2808659 buy 1.00 EURUSD at 1.28974 at price 1.28975 17:17:52 temp EURUSD,M1: ошибка=0 17:17:54 temp EURUSD,M1: Пришёл новый тик 17:17:54 temp EURUSD,M1: Всего ордеров = 2 17:17:54 temp EURUSD,M1: удаляем ордер = 0 тикет ордера = 2808658 17:17:54 temp EURUSD,M1: close #2808658 buy 1.00 EURUSD at 1.28969 at price 1.28976 17:17:54 temp EURUSD,M1: ошибка=0 17:17:56 temp EURUSD,M1: Пришёл новый тик 17:17:56 temp EURUSD,M1: Всего ордеров = 1 17:17:56 temp EURUSD,M1: удаляем ордер = 0 тикет ордера = 2808660 17:17:56 temp EURUSD,M1: close #2808660 buy 1.00 EURUSD at 1.28976 at price 1.28977 17:17:56 temp EURUSD,M1: ошибка=0
в учебнике по MQL в главе Стандартные функции в разделе Операции с графиками приведена функция WindowHandle со следующим описанием: "… возвращает системный дескриптор окна (window handle), содержащего указанный график".
Вопрос: что означает (что такое) "системный дескриптор окна" и для чего он нужен?
P.S. Чтобы не захламлять форум, заранее благодарю за ответ
в учебнике по MQL в главе Стандартные функции в разделе Операции с графиками приведена функция WindowHandle со следующим описанием: "… возвращает системный дескриптор окна (window handle), содержащего указанный график".
Вопрос: что означает (что такое) "системный дескриптор окна" и для чего он нужен?
P.S. Чтобы не захламлять форум, заранее благодарю за ответ
Ответ:
дескриптор окна - это число
дескриптор окна нужен для последующей работы с окном
int start() { for (int i=OrdersHistoryTotal()-1;i>=0; i--) { if( OrderSelect(i, SELECT_BY_POS, MODE_HISTORY)) { if (TimeDay (OrderOpenTime())==Day() && TimeMonth(OrderOpenTime())==Month() && TimeYear (OrderOpenTime())==Year()) if(OrderType()==OP_SELL && OrdersTotal()==0 || OrdersHistoryTotal()==0) { OrderSend( Symbol(), OP_BUY, 0.1, Ask, 5,Bid-25*Point,Bid+25*Point, "", 0, 0, Blue ); } if( OrderType()==OP_BUY && OrdersTotal()==0 || OrdersHistoryTotal()==0) { OrderSend( Symbol(), OP_SELL, 0.1, Bid, 5,Ask-25*Point,Ask+25*Point, "", 0, 0, Red ); } } } return(0); }здравствуйте! проблема с кодам!!! мне нужно чтобы ордера открывались по очереди sell, bay, sell и т.д. но чтобы подсчет велся в течений дня, на следующий день по новому, не учитывая последовательность открытия ордеров предыдущего дня! то есть новый день новый цикл! выше код я думаю, что это примерно так должно выглядеть! только вот советник не открывает ни одного ордера! не могу понять в чем дела...подскажите если знаете!!
Так при открытие отложенного ордера задайте время истечения отложенного ордера, скажем 23:59, он сам и закроется.
nt OrderSend( string symbol, int cmd, double volume, double price, int slippage, double stoploss, double takeprofit, string comment=NULL, int magic=0, datetime expiration=0, color arrow_color=CLR_NONE)
здравствуйте! проблема с кодам!!! мне нужно чтобы ордера открывались по очереди sell, bay, sell и т.д. но чтобы подсчет велся в течений дня, на следующий день по новому, не учитывая последовательность открытия ордеров предыдущего дня! то есть новый день новый цикл! выше код я думаю, что это примерно так должно выглядеть! только вот советник не открывает ни одного ордера! не могу понять в чем дела...подскажите если знаете!!
А почему он должен открывать ордера, особенно если в история пустая. И научитесь код вставлять по человечески, мне не нравится редактировать чужие посты.
Как в этом советнике дополнить
//+------------------------------------------------------------------+
//| CCI.mq4 |
//| Copyright 2012, MetaQuotes Software Corp. |
//| http://www.metaquotes.net |
//+------------------------------------------------------------------+
#property copyright "Copyright 2012, MetaQuotes Software Corp."
#property link "http://www.metaquotes.net"
extern double LotTrend = 0.1;
extern int TP=100;
extern int SL=250;
//+------------------------------------------------------------------+
//| expert initialization function |
//+------------------------------------------------------------------+
int init()
{
//----
//----
return(0);
}
//+------------------------------------------------------------------+
//| expert deinitialization function |
//+------------------------------------------------------------------+
int deinit()
{
//----
//----
return(0);
}
//+------------------------------------------------------------------+
//| expert start function |
//+------------------------------------------------------------------+
int start()
{
if (OrderSelect(0,SELECT_BY_POS,MODE_TRADES)==False)
{
if (Bid>iMA(Symbol(),PERIOD_M15,100,0,1,4,0)
)
{
OrderSend(Symbol(),OP_BUY,LotTrend,Ask,0,Ask-SL*Point,Ask+TP*Point,0,0,0,Green);
}
if (Bid<iMA(Symbol(),PERIOD_M15,100,0,1,4,0)
)
{
OrderSend(Symbol(),OP_SELL,LotTrend,Bid,0,Bid+SL*Point,Bid-TP*Point,0,0,0,Green);
}
}
//----
return(0);
}
//+------------------------------------------------------------------+
1.Чтобы Сделка открывалась только по закрытию свечи.(Когда цена пересекает SMA)
Если его компилировать в этом виде, то при расширении левой границы графика и подгрузке истории он начинает глючить и показывать метки там, где их быть не должно (см. скрин во вложении). Если закомментировать часть кода:
То такие глюки исчезают... эти же глюки появляются при подгрузке истории, если заполнять только "непустые" элементы индикаторного массива и не обнулять значение индикатора там, где метки нет...
Почему это происходит? Почему, получается, обязательно надо при подгрузке истории пересчитывать весь индикатор? И почему надо обнулять значения "пустых" элементов инд. массива?
Если бы бары индексировались слева направо, то при подгрузке истории индексы баров сменялись бы и индикатор без перерасчёта отображался бы неверно, тогда был бы понятен такой глюк... Но ведь в МТ4 бары индексируются справа налево, значит, при подгрузке истории, индексы тех баров, которые были, должны были остаться теми же (и значения индикатора тоже), тогда зачем перерасчитывать индикатор и откуда берутся эти сдвиги меток?
Коллеги подскажите ответ на следующий вопрос.
Открываю руками 4 ордера на бай, запускаю советник который удаляет установленные ордера по цене бид, проскальзывание поставил 100 пунктов, удаление в цикле, проверка занятости потока и обновление котировок присутствует. Почему ордера не удаляются в цикле все ? по логу видно что удаление идёт за несколько инициализаций функции start()
код советника
вот лог советника:
17:16:59 temp EURUSD,M1: loaded successfully
17:17:51 temp EURUSD,M1: Пришёл новый тик
17:17:51 temp EURUSD,M1: Всего ордеров = 4
17:17:51 temp EURUSD,M1: удаляем ордер = 0 тикет ордера = 2808657
17:17:52 temp EURUSD,M1: close #2808657 buy 1.00 EURUSD at 1.28969 at price 1.28973
17:17:52 temp EURUSD,M1: ошибка=0
17:17:52 temp EURUSD,M1: удаляем ордер = 1 тикет ордера = 2808659
17:17:52 temp EURUSD,M1: close #2808659 buy 1.00 EURUSD at 1.28974 at price 1.28975
17:17:52 temp EURUSD,M1: ошибка=0
17:17:54 temp EURUSD,M1: Пришёл новый тик
17:17:54 temp EURUSD,M1: Всего ордеров = 2
17:17:54 temp EURUSD,M1: удаляем ордер = 0 тикет ордера = 2808658
17:17:54 temp EURUSD,M1: close #2808658 buy 1.00 EURUSD at 1.28969 at price 1.28976
17:17:54 temp EURUSD,M1: ошибка=0
17:17:56 temp EURUSD,M1: Пришёл новый тик
17:17:56 temp EURUSD,M1: Всего ордеров = 1
17:17:56 temp EURUSD,M1: удаляем ордер = 0 тикет ордера = 2808660
17:17:56 temp EURUSD,M1: close #2808660 buy 1.00 EURUSD at 1.28976 at price 1.28977
17:17:56 temp EURUSD,M1: ошибка=0