Forex Forum - Независимый форекс форум для трейдеров

Forex Forum - Независимый форекс форум для трейдеров (https://forexsystemsru.com/)
-   Язык программирования MQL4 (https://forexsystemsru.com/yazyk-programmirovaniya-mql4-f72/)
-   -   Добавляем функцию lock (лок) в исходный код советника (https://forexsystemsru.com/yazyk-programmirovaniya-mql4/67749-dobavlyaem-funkciyu-lock-lok-v-ishodnyi-kod-sovetnika.html)

A1ex 10.05.2012 07:52

Добавляем функцию lock (лок) в исходный код советника
 
1. В исходный код советника добавляем переменные.

Скрытый текст

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);
}
[свернуть]

SW111 10.05.2012 08:57

Вложений: 1
хмм...может научите как код статистки вставить в любого робота?
код статистики прилагаю...

A1ex 10.05.2012 09:01

Вложений: 1
Цитата:

Сообщение от SW111 (Сообщение 434065)
хмм...может научите как код статистки вставить в любого робота?
код статистики прилагаю...

Вы сами скачать пробовали? Для статы лучше использовать сову:

sly 10.05.2012 09:41

Вложений: 1
Добавте пожалуйста в этот советник функцию лок при достижении определённого % от депо.

A1ex 10.05.2012 09:50

Цитата:

Сообщение от sly (Сообщение 434098)
Добавте пожалуйста в этот советник функцию лок при достижении определённого % от депо.

С этим не ко мне. Могу добавить только то что написано.

SW111 10.05.2012 11:22

Цитата:

Сообщение от A1ex (Сообщение 434069)
Вы сами скачать пробовали? Для статы лучше использовать сову:

пробовал...хрень какая-то...

а в вашей сове многа букав...ниасилил...

но вы натолкнули меня на мысль...спасиба...

tai78 10.05.2012 11:26

попробовал добавить, выдал вот такие ошибки
'GetAmountLotFro' - variable not defined D:\Disk C\÷àñòü äèñêà Ä\MetaTrader Finam\experts\Dracula Forex Robot V _II.mq4 (2709, 39)

if (lock_lot==0)lock_lot=NormalizeLot(GetAmountLotFro mOpenPos("", OP_SELL,-1)/lock_part);

'KanalMa' - variable not defined D:\Disk C\часть диска Д\MetaTrader Finam\experts\Dracula Forex Robot V _II.mq4 (2742, 47)
'x' - variable not defined D:\Disk C\часть диска Д\MetaTrader Finam\experts\Dracula Forex Robot V _II.mq4 (2742, 55)

if (Digits==5)return(MathAbs(NormalizeDouble((KanalMa x-KanalMin)/Point/10,0))*result);
if (Digits==4)return(MathAbs(NormalizeDouble((KanalMa x-KanalMin)/Point,0))*result);

Все дошло,спасибо,в коде есть орфографичесие ошибки.

strannik-ps 10.05.2012 11:55

Цитата:

Сообщение от tai78 (Сообщение 434167)
попробовал добавить, выдал вот такие ошибки

Видимо неправильно прописали. Функции.
Замените в советнике start() на start_main(), а функцию лока
int start(){
double AccountRisk = (AccountBalance()-AccountEquity())/AccountBalance()*100;
if (AccountRisk >Risk) lock_flag=true;
if(OrdersTotal()<1){lock_eqviti=AccountBalance();l ock_last = Close[0];}
if(lock_flag) start_lock(); else start_main();
return(0);
}

пропишите в советник выше start_main()
4. Ниже добавляем: это в самый конец советника.
Ну и init() по схеме. также и в шапке советника 1. В исходный код.....

tai78 10.05.2012 12:06

Цитата:

Сообщение от strannik-ps (Сообщение 434185)
Видимо неправильно прописали. Функции.
Замените в советнике start() на start_main(), а функцию лока
int start(){
double AccountRisk = (AccountBalance()-AccountEquity())/AccountBalance()*100;
if (AccountRisk >Risk) lock_flag=true;
if(OrdersTotal()<1){lock_eqviti=AccountBalance();l ock_last = Close[0];}
if(lock_flag) start_lock(); else start_main();
return(0);
}
пропишите в советник выше start_main()
4. Ниже добавляем: это в самый конец советника.
Ну и init() по схеме. также и в шапке советника 1. В исходный код.....

Да нее,там просто в коде ошибки я так понял вот эти:l ock_last ...
тоесть стоят пробелы я их убрал и перестал ругатся,тока бы терь понять что это сработал лок в советнике,пока тока замечаю что при просадке в 5% он закрывает все позиции.

strannik-ps 10.05.2012 12:17

Цитата:

Сообщение от tai78 (Сообщение 434190)
Да нее,там просто в коде ошибки я так понял вот эти:l ock_last ...
тоесть стоят пробелы я их убрал и перестал ругатся,тока бы терь понять что это сработал лок в советнике,пока тока замечаю что при просадке в 5% он закрывает все позиции.

Попробуйте так.
int start(){
if (AccountProfit()<-Профит) lock_flag=true;
if(OrdersTotal()<1){lock_eqviti=AccountBalance();l ock_last = Close[0];}
if(lock_flag) start_lock(); else start_main();
return(0);
}
Профит замените на риск и тогда будет от просадки в валюте.

sly 11.05.2012 15:58

Цитата:

Сообщение от strannik-ps (Сообщение 434197)
Попробуйте так.
int start(){
if (AccountProfit()<-Профит) lock_flag=true;
if(OrdersTotal()<1){lock_eqviti=AccountBalance();l ock_last = Close[0];}
if(lock_flag) start_lock(); else start_main();
return(0);
}
Профит замените на риск и тогда будет от просадки в валюте.

Попробуйте вы добавить лок в сову, может получится.

strannik-ps 11.05.2012 16:59

Цитата:

Сообщение от sly (Сообщение 434953)
Попробуйте вы добавить лок в сову, может получится.

Пояснения в коде.

sly 11.05.2012 17:49

Цитата:

Сообщение от strannik-ps (Сообщение 434983)
Пояснения в коде.

Золотой вы человек я пока ещё толком не разобрался с этим локом но уже вижу что безопасная торговля стала. СПАСИБО!

sly 11.05.2012 17:50

Цитата:

Сообщение от strannik-ps (Сообщение 434983)
Пояснения в коде.

Есть тема одна? за денежку возмётесь написать бота?

tai78 13.05.2012 10:23

Цитата:

Сообщение от strannik-ps (Сообщение 434197)
Попробуйте так.
int start(){
if (AccountProfit()<-Профит) lock_flag=true;
if(OrdersTotal()<1){lock_eqviti=AccountBalance();l ock_last = Close[0];}
if(lock_flag) start_lock(); else start_main();
return(0);
}
Профит замените на риск и тогда будет от просадки в валюте.

а что надо прописать в коде и как это выглядит, чтоб было видно хотяб в журнале что сработал ЛОК?

strannik-ps 13.05.2012 10:52

Цитата:

Сообщение от tai78 (Сообщение 435701)
а что надо прописать в коде и как это выглядит, чтоб было видно хотяб в журнале что сработал ЛОК?

Пост #12 для примера.
А для отображения в журнале отвечает функция Print на Code Base много описано про нее.

tai78 13.05.2012 11:12

Цитата:

Сообщение от strannik-ps (Сообщение 435714)
Пост #12 для примера.
А для отображения в журнале отвечает функция Print на Code Base много описано про нее.

я по 12 посту и переделал,но там вроде нет информационной функции о срабатывании лока

tai78 14.05.2012 16:13

Вложений: 1
Цитата:

Сообщение от strannik-ps (Сообщение 435714)
Пост #12 для примера.
А для отображения в журнале отвечает функция Print на Code Base много описано про нее.

посмотрите пожалуйста правильно ли я вставил лок,почемуто в тестере тестируется тока когда меняешь risk и просадку, тоесть от этого меняется торговля ее режим, но при изменении параметра lock_part - торговля неменяется((. И должно ли всегда отображатся когда нажимаешь открыть график после тестирования-сам ADX, у меня отобразился лишь тока раз и то когда risk ставишь 100, если поставить другое значение то он неотображается.

strannik-ps 14.05.2012 16:28

Цитата:

Сообщение от tai78 (Сообщение 436218)
посмотрите пожалуйста правильно ли я вставил лок,почемуто в тестере тестируется тока когда меняешь risk и просадку, тоесть от этого меняется торговля ее режим, но при изменении параметра lock_part - торговля неменяется((. И должно ли всегда отображатся когда нажимаешь открыть график после тестирования-сам ADX, у меня отобразился лишь тока раз и то когда risk ставишь 100, если поставить другое значение то он неотображается.

Попробуй с Такими изменениями. А лучше будет убрать риск, чтоб от просадки в валюте работал.

tai78 14.05.2012 17:00

Цитата:

Сообщение от strannik-ps (Сообщение 436222)
Попробуй с Такими изменениями. А лучше будет убрать риск, чтоб от просадки в валюте работал.

хорошо,сейчас попробую, а в валюте тогда как получится,если я правильно понял, ставлю скажем при просадке в 200, советник будет открывать локирующий лот через каждые 200$ просадки, а соответственно так как включен мартин и при увеличении лота он скажем откроет лотом 1 и пойдет от этого лота просадка еще 200, а лот то большой и просадка на 200 быстро получится он откроет еще пусть следующий лот 1.5 и опять же не в нашу сторону,может сильно в минус уйти,будет прибавлятся и прибавлятся,тоесть "Параметр просадка" надо тоже чтоб скажем увеличивался при увеличении лота,надеюсь вы меня поняли что я хотел сказать)))


Текущее время: 16:04. Часовой пояс GMT.

Перевод: zCarot
Copyright ©2000 - 2018, Jelsoft Enterprises Ltd.
SEO by vBSEO