Ваши вопросы по языку MQL4

aufx

Интересующийся
Посмотрите файл include\WinUser32.mqh Там описаны функции вызова WinAPI из user32.dll, и почти все из них принимают дескриптор как аргумент.

Спасибо! Не подскажете где можно поподробнее ознакомиться с работой этих функций?
 

aufx

Интересующийся
1 Пример:
Допустим нужно что бы советник отличал свои ордера от чужих. Для этого используют Magic. А если нужно что бы после перезапуска терминала советник забыл свои старые ордера. В качестве magic можно использовать дескриптор окна. Маджики у все советников будут разными потому что дескрипторы разные. И при перезапуске советники забудут свои старые ордера, так как после перезапуска дескрипторы будут другими.
2 пример:
Допустим советник, при запуске терминала сильно тормозит. Или по другой причине, нужно что бы советники запускались не одновременно.
На первом тике после запуска ставим Sleep. Время задержки задаём рандомом. Но рандом генерит псевдо случайность. По этому у всех советников будут одинаковые значения. А вот если предварительно рандом генераторы инициализировать дескриптором окна, то в результате у всех советников будет выдержана разная пауза.
Если подумать можно придумать много примеров. Только зачем? Лучше действовать наоборот. Для решения задач искать подходящий инструментарий, вместо того что бы искать задачи по инструментарий.

Спасибо!
 

qqmber

Почетный гражданин
Спасибо! Не подскажете где можно поподробнее ознакомиться с работой этих функций?
Эти функции выполняются не терминалом, а самой Виндой, описания соответственно читать на msdn.microsoft.com.
 

vetallic

Местный знаток
всем прет!
решил поковырятся с пивот...
вопрос, как указать выбранный период времени для отображения пивот (например дневной для всех таймов...)
 

brend

Прохожий
Здравствуйте!
Хочу к советнику из учебника прикрутить индикатор. В индикаторе есть эти строки:

Код:
Expand Collapse Copy
if (trend > 0) UpBuffer[shift] = MABuffer;
      else if (trend < 0) DnBuffer[shift] = MABuffer;

Помогите из них добыть сигналы buy u sell :fa:
 

brend

Прохожий
Здравствуйте!
Хочу попробовать к советнику из учебника прикрутить индикатор. В индикаторе есть строки :
Код:
Expand Collapse Copy
if (trend > 0) UpBuffer[shift] = MABuffer;
      else if (trend < 0) DnBuffer[shift] = MABuffer;

Помогите, пожалуйста, добыть из них сигналы buy u sell
 

AlexeyVik

Программист mql4 mql5
Здравствуйте!
Хочу попробовать к советнику из учебника прикрутить индикатор. В индикаторе есть строки :
Код:
Expand Collapse Copy
if (trend > 0) UpBuffer[shift] = MABuffer;
      else if (trend < 0) DnBuffer[shift] = MABuffer;
Помогите, пожалуйста, добыть из них сигналы buy u sell
Ставишь на график индикатор. В свойствах на закладке "Цвет" смотришь Какая цифра слева от интересующего тебя цвета. Это и есть номер буфера. Этот номер и надо ставить в функцию iCustom(string symbol, int timeframe, string name, ..., int mode, int shift)
 

brend

Прохожий
Ставишь на график индикатор. В свойствах на закладке "Цвет" смотришь Какая цифра слева от интересующего тебя цвета. Это и есть номер буфера. Этот номер и надо ставить в функцию iCustom(string symbol, int timeframe, string name, ..., int mode, int shift)


Спасибо! Буду пробовать :question:
 

Corey Hate

Новичок форума
Здравствуйте! Помогите, пожалуйста, разобраться с функцией Hour(). Мне не понятно следующее: ноль возвращается с 23:00:01 до 0:00:00 или с 0:00:01 до 1:00:00?
 

qqmber

Почетный гражданин
Здравствуйте! Помогите, пожалуйста, разобраться с функцией Hour(). Мне не понятно следующее: ноль возвращается с 23:00:01 до 0:00:00 или с 0:00:01 до 1:00:00?
Ноль возвращается с 00:00:00 по 00:59:59 включительно.
 

jib07

Местный житель
Здравствуйте! Сломал всю голову, ничего не смог придумать, помогите.

Проблема:

Как удалить отложенный ордер, если на этой цене уже есть такой же.

Задача:

Поставить отложенный ордер, если на этой цене уже есть полностью идентичный ордер, удалить предыдущий!

Спасибо!
 

sbmill

Местный житель
Здравствуйте!!!
Пишу первый простенький индикатор по расхождению валютных курсов GBPUSD&USDCAD от заданной нулевой точки в валюте депозита USD, сталкнулся с проблемкой, когда устанавливаю индикатор на график GBPUSD полученная линия расчитанная по формуле Buf_0 отображается корректно, а вторая линия расчитанная по формуле Buf_1 отображается не корректно т.к. считает Close той валютной пары на график которой установлен индикатор. Вопрос, что добавить в Buf_1, чтобы расчет производился по валютной паре USDCAD, когда индикатор устанавливаешь на график GBPUSD.
Buf_0=(3000*Close)-(3000*1.5493);
Buf_1=((5000*1.0199)-(5000*Close))/Close;
 

qqmber

Почетный гражданин
Здравствуйте!!!
... чтобы расчет производился по валютной паре USDCAD, когда индикатор устанавливаешь на график GBPUSD.
Чтобы получить котировку другой пары используйте функцию
double iClose( string symbol, int timeframe, int shift)
 

maks5317

Активный участник
проясните ситуевину?вкрутил лок,но помоему один алгоритм мешает другому?посмотрите не проходите мимо?
extern double Risk = 5;
extern int lock_min_step = 30; //ограничение на минимальный шаг, чтобы не получилось каждый пипс новый лок
extern int lock_part = 2; //насколько частей будем дробить убыток который находится в рынке, если 2 то значит на 1/2
string lock_signalsymbol = "EURUSD";
static double lock_eqviti,lock_last, lock_lot;
static bool lock_flag,flagADX,old_uptrend;

2. Функцию start() переименовываем в start_main() и добавляем над ней:
int start(){
double AccountRisk = (AccountBalance()-AccountEquity())/AccountBalance()*100;
if (AccountRisk >Risk) lock_flag=true;
if(OrdersTotal()<1){lock_eqviti=AccountBalance();lock_last = Close[0];}
if(lock_flag) start_lock(); else start_main();
return(0);
}

3. В функцию init() добавляем
int init(){
init_lock();
return(0);
}

4. Ниже добавляем:
int init_lock(){
lock_eqviti=AccountBalance();
lock_lot = 0;
lock_last = Close[0];
flagADX=true;
old_uptrend=false;
signal();
lock_flag = false;
return(0);
}

void start_lock(){
int sig,step;
if(OrdersTotal()<1){init_lock();return(0);}
notakeprofit();
if (AccountEquity()>=lock_eqviti){CloseAllFirstProfit();init_lock();return(0);}
else{
sig=signal();
step =MathAbs(sig);
if (step<lock_min_step) return(0);
if (Ask>lock_last+(step*Point) && sig>0 ){
if (lock_lot==0)lock_lot=NormalizeLot(GetAmountLotFromOpenPos("", OP_SELL,-1)/lock_part);
RefreshRates();
OrderSend(Symbol(),OP_BUY,lock_lot,Ask,5,0,0,"lock",0,Blue);
lock_last = Ask;
}
if (Bid<lock_last-(step*Point) && sig<0){
if (lock_lot==0) lock_lot=NormalizeLot(GetAmountLotFromOpenPos("", OP_BUY,-1)/lock_part);
RefreshRates();
OrderSend(Symbol(),OP_SELL,lock_lot,Bid,5,0,0,"lock",0,Blue);
lock_last = Bid;
}
}
return;
}

int signal() {
int i, j, result;
double smin, smax, SsMax, SsMin, SSP, price,KanalMin,KanalMax;
SSP = MathCeil(150 / iADX(lock_signalsymbol, PERIOD_M5, 14, PRICE_TYPICAL, MODE_MAIN, 1));
for (j = 120; j >= 0; j--) {
SsMax = iHigh(lock_signalsymbol, PERIOD_M5,j);SsMin = iLow(lock_signalsymbol, PERIOD_M5,j);
for (i = j; i <= j + SSP - 1; i++) {
price = iHigh(lock_signalsymbol, PERIOD_M5,i);
if (SsMax < price)SsMax = price;
price = iLow(lock_signalsymbol, PERIOD_M5,i);if (SsMin >= price)SsMin = price;}
smin = SsMin + (SsMax - SsMin)*0.30;smax = SsMax - (SsMax - SsMin)*0.30;
if (iClose(lock_signalsymbol, PERIOD_M5,j) < smin) {flagADX = false; KanalMin = smin;}
if (iClose(lock_signalsymbol, PERIOD_M5,j) > smax) {flagADX = true; KanalMax=smax;}
result = 0;
if (flagADX != old_uptrend && flagADX == true) result = +1;
if (flagADX != old_uptrend && flagADX == false) result = -1;
old_uptrend = flagADX;
}
if (Digits==5)return(MathAbs(NormalizeDouble((KanalMax-KanalMin)/Point/10,0))*result);
if (Digits==4)return(MathAbs(NormalizeDouble((KanalMax-KanalMin)/Point,0))*result);
}

void CloseAllFirstProfit() {
int i, k=OrdersTotal();
for (i=k-1; i>=0; i--) if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) if (OrderType()==OP_BUY || OrderType()==OP_SELL) if (OrderProfit()+OrderSwap()>0) ClosePosBySelect();
k=OrdersTotal();
for (i=k-1; i>=0; i--) if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) if (OrderType()==OP_BUY || OrderType()==OP_SELL) ClosePosBySelect();
}

void ClosePosBySelect() {
if (OrderType()==OP_BUY) OrderClose(OrderTicket(), OrderLots(), MarketInfo(OrderSymbol(), MODE_BID), 100, CLR_NONE);
if (OrderType()==OP_SELL) OrderClose(OrderTicket(), OrderLots(), MarketInfo(OrderSymbol(), MODE_ASK), 100, CLR_NONE);
}

double GetAmountLotFromOpenPos(string sy="", int op=-1, int mn=-1) {
double l=0;
int i,k=OrdersTotal();
if (sy=="0") sy=Symbol();
for (i=0; i<k; i++) if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) if (OrderSymbol()==sy || sy=="") if (OrderType()==OP_BUY || OrderType()==OP_SELL) if (op<0 || OrderType()==op) if (mn<0 || OrderMagicNumber()==mn) l+=OrderLots();
return(l);
}

bool notakeprofit(){
bool ok=true;
for (int i=OrdersTotal(); i >=0; i--) if ( OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) if (OrderSymbol() == Symbol() && OrderTakeProfit()>0){ OrderModify(OrderTicket(), OrderOpenPrice(), OrderStopLoss(),NormalizeDouble(0,Digits), 0, CLR_NONE);ok=false;return(ok);}
return(ok);
}

double NormalizeLot(double lo, bool ro=True, string sy="") {
double l, k;
if (sy=="" || sy=="0") sy=Symbol();
double ls=MarketInfo(sy, MODE_LOTSTEP);
double ml=MarketInfo(sy, MODE_MINLOT);
double mx=MarketInfo(sy, MODE_MAXLOT);
if (ml==0) ml=0.1;
if (mx==0) mx=100;
if (ls>0) k=1/ls; else k=1/ml;
if (ro) l=MathCeil(lo*k)/k; else l=MathFloor(lo*k)/k;
if (l<ml) l=ml;
if (l>mx) l=mx;
return(l);
}
 

Вложения

Последнее редактирование модератором:

eevviill

Заблокирован
Здравствуйте! Сломал всю голову, ничего не смог придумать, помогите.

Проблема:

Как удалить отложенный ордер, если на этой цене уже есть такой же.

Задача:

Поставить отложенный ордер, если на этой цене уже есть полностью идентичный ордер, удалить предыдущий!

Спасибо!
Ну думаю перебором ордеров.
В цыкле пишешь условие что если OrderOpenPrice()==необходимая цена, то OrderDelete()
 
Верх