С такими условиями советник открывает сделку, скажем, на SELL, закрывает ее по профиту и тут же открывает еще одну сделку на SELL. Как прописать в советникe, что при поступлении сигнала должна открываться только одна сделка, т.е. один сигнал - одна сделка. Заранее благодарен.
1 вариант - либо условие на сделку проверить так что: индекс 2 показывает сигнал на покупку, а индекс 1 на продажу, тогда на открытии бара с индексом 0 будет открыта сделка на продажу.
2 вариант - проверять историю ордеров и сравнивать индексы сигнала и ордера, если совпадают, то больше не открывать ордеров.
Уже второй день мучаюсь и не могу сообразить. Нужно найти самую низкую цену за последние n баров, но только не от текущего бара, а от бара получаемого через функцию. Функция возвращает индекс бара, на котором был открыт ордер. Вот от этого бара и нужно найти назад по истории на n баров самую низкую цену. Ниже мой код, что не так в нем?
int n = 10; //баров в глубь истории
index_bar= ND(iLow(Symbol(),0,i)); // начинаем с этого бараdouble val=Low[iLowest(NULL,0,MODE_LOW,n,index_bar)];
У меня возник следующий вопрос. Как перехватить колёсико мыши, какими функциями винапи? Объясню для чего. В экстернах находится интовый параметр. Нужно вращением колёсика его увеличивать или уменьшать.
Вы когда найдете как это сделать, так опубликуйте...
Пока так только сообразил:
#property indicator_chart_window#property indicator_buffers 1#property indicator_color1 RoyalBlue#import "user32.dll"int GetKeyState(int nVirtKey);//обрабочик клавиатуры#importexternint period = 1;
externbool WinAPI = false;//включение-отключение перехвата клавиатуры
externstring s1="Alt+ArrowUp - increment of period";//памятка
externstring s2="Alt+ArrowDown - decrement of period";
externstring s3="Alt+Home - period=1";
double SMA[];
int Alt, ArrowUp, ArrowDown, Home;
int init(){
SetIndexStyle(0,DRAW_LINE);
SetIndexBuffer(0,SMA);
if(WinAPI){//запоминаем состояние клавиш
Alt = GetKeyState(18);
ArrowUp = GetKeyState(38);
ArrowDown = GetKeyState(40);
Home = GetKeyState(36);
}
return(0);
}
int deinit(){
if(WinAPI) Comment(" ");
return(0);
}
int start(){
if(WinAPI){//ставим сконденсированный флаг и снова запоминаем состояние клавиш НА КАЖДОМ ТИКЕ
int flag = ((Alt!=GetKeyState(18)) && Home==GetKeyState(36)) + 10*((Alt!=GetKeyState(18)) && (ArrowUp==GetKeyState(38))) + 100*((Alt!=GetKeyState(18)) && (ArrowDown==GetKeyState(40)));
Alt = GetKeyState(18);
ArrowUp = GetKeyState(38);
ArrowDown = GetKeyState(40);
Home = GetKeyState(36);
}
int counted_bars=IndicatorCounted();
if(WinAPI){//разводка сконденсированного флага; перед limit, чтобы отсюда эмулировать прикрепление к графику
switch(flag){
case11:
if(period>1){
period--;
counted_bars = 0;
}
break;
case101:
period++;
counted_bars = 0;
break;
case110:
period=1;
counted_bars = 0;
}
}
int limit = Bars - counted_bars - 1;
/*Шпаргалка. В первый заход counted_bars = 0, limit = Bars - 1 (номер самого левого БАРа, т.к. считается с нуля)
на первом тике нулевого бара counted_bars = Bars - 2, limit = 1 (пересчитаем предпоследний БАР)
на следующих тиках counted_bars = Bars - 1, limit = 0 (нулевой, он же текущий, БАР)*/if(WinAPI) Comment("flag=", flag, ", period=", period);//принтуем в коммент для визуализации
for(int bar=0; bar<=period*(limit/period); bar++){//обычный цикл индикаторов
SMA[bar] = iMA(NULL, 0, period, 0, MODE_SMA, PRICE_CLOSE, bar);
}
return(0);
}
вопрос стоит с хуками, хотя я решил эту проблему проще - если надо то я делаю свое окно настроек в ДЛЛке и там уже творю что хочу с виндовыми контролами.
Для авторизации и пользования сайтом MQL5.com необходимо разрешить использование файлов Сookie.
Пожалуйста, включите в вашем браузере данную настройку, иначе вы не сможете авторизоваться.
Вы вошли в аккаунт. Двухфакторная аутентификация отключена. Настройте её заново и отсканируйте новый QR-код или продолжите с отключённой двухфакторной аутентификацией.
Уважаемые форумчане! Огромная просьба помочь.
if (TimeBar==Time[0]) return(0);
double MA1 = NormalizeDouble(iMA(NULL,TimeFrame_2,MA_Period_2,MA_Shift_2,MA_Method_2,Applied_Price_2,0),Digits); // где 0 - это сдвиг относительно текущего бара на указ. кол-во периодов назад
//double MA21 = NormalizeDouble(iMA(NULL,timeframe_2,period_2,ma_shift_2,ma_method_2,applied_price_2,2),Digits);
double MA2 = NormalizeDouble(iMA(NULL,TimeFrame_3,MA_Period_3,MA_Shift_3,MA_Method_3,Applied_Price_3,0),Digits);
//double MA31 = NormalizeDouble(iMA(NULL,timeframe_3,period_3,ma_shift_3,ma_method_3,applied_price_3,2),Digits);
double MA3 = NormalizeDouble(iMA(NULL,TimeFrame_4,MA_Period_4,MA_Shift_4,MA_Method_4,Applied_Price_4,0),Digits);
double OsMA = NormalizeDouble(iOsMA(NULL,TimeFrame_5,FastEMA_5,SlowEMA_5,SignalSMA_5,Applied_Price_5,0),Digits);
if (MaxOrders>b && Low[0]>=MathMax(MA1,MA2)&& Low[0]>MA3 && Ask>MathMax(MA1,MA2)+DeltaOpen*Point && Ask>MA3 && MA2<MA3 && MA1<MA3 && OsMA>0 && Trade)
{
if (OrderSend(Symbol(),OP_BUY,Lots,NormalizeDouble(Ask,Digits),Slippage,SL,TP,"Puria_1",Magic,0,Blue) ==-1) TimeBar=0;
else TimeBar=Time[0];
}
if (MaxOrders>s && High[0]<=MathMin(MA1,MA2) && High[0]<MA3 && Bid<MathMin(MA1,MA2)-DeltaOpen*Point && Bid<MA3 && MA1>MA3 && MA2>MA3 && OsMA<0 && Trade)
{
if (OrderSend(Symbol(),OP_SELL,Lots,NormalizeDouble(Bid,Digits),Slippage,SL,TP,"Puria_1",Magic,0,Red) ==-1) TimeBar=0;
else TimeBar=Time[0];
}
return(0);
С такими условиями советник открывает сделку, скажем, на SELL, закрывает ее по профиту и тут же открывает еще одну сделку на SELL. Как прописать в советникe, что при поступлении сигнала должна открываться только одна сделка, т.е. один сигнал - одна сделка.
Заранее благодарен.
1 вариант - либо условие на сделку проверить так что: индекс 2 показывает сигнал на покупку, а индекс 1 на продажу, тогда на открытии бара с индексом 0 будет открыта сделка на продажу.
2 вариант - проверять историю ордеров и сравнивать индексы сигнала и ордера, если совпадают, то больше не открывать ордеров.
Где и как инициализируется переменная TimeBar?
Хотя в Вашем случае это мало чем поможет. Я вижу в условиях переменную Trade, вот ей и регулируйте открытие.
Уже второй день мучаюсь и не могу сообразить. Нужно найти самую низкую цену за последние n баров, но только не от текущего бара, а от бара получаемого через функцию. Функция возвращает индекс бара, на котором был открыт ордер. Вот от этого бара и нужно найти назад по истории на n баров самую низкую цену. Ниже мой код, что не так в нем?
как-то так
как-то так
Премного благодарен! Пытался тоже уже этой функцией воспользоваться, только опять же в цикле, оказывается все просто ))) Спасибо еще раз!
gyfto:
У меня возник следующий вопрос. Как перехватить колёсико мыши, какими функциями винапи? Объясню для чего. В экстернах находится интовый параметр. Нужно вращением колёсика его увеличивать или уменьшать.
Вы когда найдете как это сделать, так опубликуйте...
Пока так только сообразил:
Мне как Вадим сказал хуками не пользоваться из-под MT4, платформа их не любит, я их и не трогаю. Возможно, зря)