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

  • Автор темы Автор темы A1ex
  • Дата начала Дата начала

A1ex

~~~~~
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);
}
 
Последнее редактирование модератором:

A1ex

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

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

Вложения

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

sly

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

Вложения

tai78

Новичок форума
попробовал добавить, выдал вот такие ошибки
'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

VIP-участник
попробовал добавить, выдал вот такие ошибки

Видимо неправильно прописали. Функции.
Замените в советнике 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

Новичок форума
Видимо неправильно прописали. Функции.
Замените в советнике 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

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

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

sly

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

tai78

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

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

strannik-ps

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

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

tai78

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

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

Вложения

strannik-ps

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

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

tai78

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

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