Как кодировать? - страница 284

 

Я нашел решение для временного фильтра Закрыть все

Внешние переменные

extern string timefilter="Time Filter";

extern int gmtshift=1; // gmt offset of the broker

extern bool generalfilter=false; // enable time filter

extern int starthour=7; // start hour to trade after this hour

extern int startminutes=0; // minutes of the start hour

extern int endhour=21; // stop to trade after this hour

extern int endminutes=0; // minutes of the start hour

extern bool tradesunday=true; // trade on sunday

extern bool fridayfilter=false; // enable special time filter on friday

extern int fridayhour=21; // stop to trade after this hour

extern int fridayminutes=0; // minutes of the friday hour

[/CODE]

int nstarthour,nendhour,nfridayhour;

string istarthour,istartminutes,iendhour,iendminutes,ifridayhour,ifridayminutes;

datetime tstart,tend,tfriday;[/CODE]

Place Code in Start,

[CODE] if(generalfilter){

nstarthour=starthour+(gmtshift);if(nstarthour>23)nstarthour=nstarthour-24;

if(nstarthour<10)istarthour="0"+nstarthour;

if(nstarthour>9)istarthour=nstarthour;

if(startminutes<10)istartminutes="0"+startminutes;

if(startminutes>9)istartminutes=startminutes;

tstart=StrToTime(istarthour+":"+istartminutes);

nendhour=endhour+(gmtshift);if(nendhour>23)nendhour=nendhour-24;

if(endhour<10)iendhour="0"+nendhour;

if(endhour>9)iendhour=nendhour;

if(endminutes<10)iendminutes="0"+endminutes;

if(endminutes>9)iendminutes=endminutes;

tend=StrToTime(iendhour+":"+iendminutes);

}

if(fridayfilter){

nfridayhour=fridayhour+(gmtshift);if(nfridayhour>23)nfridayhour=nfridayhour-24;

if(nfridayhour<10)ifridayhour="0"+nfridayhour;

if(nfridayhour>9)ifridayhour=nfridayhour;

if(fridayminutes<10)ifridayminutes="0"+fridayminutes;

if(fridayminutes>9)ifridayminutes=fridayminutes;

tfriday=StrToTime(ifridayhour+":"+ifridayminutes);

}

if((generalfilter && (nstarthour<nendhour && TimeCurrent()tend) || (nstarthour>nendhour && TimeCurrent()tend))

|| (tradesunday==false && DayOfWeek()==0) || (fridayfilter && DayOfWeek()==5 && TimeCurrent()>tfriday))

{

CloseAll();

Comment("Non-trading Hours All Positions Closed");

return(0);

}

and the CloseAll function.

[CODE]

void CloseAll(){

int total = OrdersTotal();

for(int i=total-1;i>=0;i--){

OrderSelect(i, SELECT_BY_POS);

int type = OrderType();

bool result = false;

switch(type){

//Close opened long positions

case OP_BUY : result = OrderClose( OrderTicket(), OrderLots(), MarketInfo(OrderSymbol(), MODE_BID), 5, Lime); break;

//Close opened short positions

case OP_SELL : result = OrderClose( OrderTicket(), OrderLots(), MarketInfo(OrderSymbol(), MODE_ASK), 5, LightGreen );

} if(result == false){

Alert("Order " , OrderTicket() , " failed to close. Error:" , GetLastError() );

Sleep(3000);

}

}

return(0);

}

спасибо за подсказки и советы Калензо

 

StopLoss

Gidday

Я пробовал эксперимент по расчету SL на основе тикового значения, максимального dd и процента на сделку.

double lotSize = NormalizeDouble(Kellylot(),2);

double Pip = Point;

if(Digits==3 || Digits==5) Pip = 10*Point;

double Bal = AccountBalance(); // $1000

double TV = MarketInfo(Symbol(), MODE_TICKVALUE); // $1

double Risk = 2; // 2%

double MaxDD = 10; // 10%

double RiskCapital = Bal*MaxDD/100; // Total Exposure 10% of $1000 = $100

double RPT = Bal*Risk/100; // 2% of $1000 = $20

double stopLoss = NormalizeDouble(RPT/TV*lotSize/Pip,Digits); //$20/1*0.01/10 = 0.02000

double Positions = MathAbs(RiskCapital/RPT); // Maximum 5 positions 100 / 20

Идея заключается в том, что в зависимости от пары, индивидуального тикового значения пары и размера лота можно установить 2% SL.

Я думаю, что это правильно, но хотел бы, чтобы кто-нибудь проверил это, если это возможно.

 
Beno:
Gidday

Я пробовал эксперимент по расчету SL на основе тикового значения, максимального dd и процента на сделку.

double lotSize = NormalizeDouble(Kellylot(),2);

double Pip = Point;

if(Digits==3 || Digits==5) Pip = 10*Point;

double Bal = AccountBalance(); // $1000

double TV = MarketInfo(Symbol(), MODE_TICKVALUE); // $1

double Risk = 2; // 2%

double MaxDD = 10; // 10%

double RiskCapital = Bal*MaxDD/100; // Total Exposure 10% of $1000 = $100

double RPT = Bal*Risk/100; // 2% of $1000 = $20

double stopLoss = NormalizeDouble(RPT/TV*lotSize/Pip,Digits); //$20/1*0.01/10 = 0.02000

double Positions = MathAbs(RiskCapital/RPT); // Maximum 5 positions 100 / 20

Идея заключается в том, что в зависимости от пары, индивидуального тикового значения пары и размера лота можно установить 2% SL.

Я думаю, что все правильно, но хотелось бы, чтобы кто-нибудь проверил это, если возможно.

Хорошая работа Бено,

Всегда лучше дать удочку, чем рыбу. Я очень рад, что смог помочь вам с некоторыми комментариями.

Что касается стоп-лосса, идея хорошая, но попробуйте рассмотреть ее в обратном направлении:

сначала установите стоп-лосс

затем устанавливаем размер сделки.

Таким образом, вы будете подстраивать вход/выход системы под условия рынка, и не будете рисковать более чем X% от вашего счета, но выход будет зависеть от логики системы, а не от процента риска.

 
Kalenzo:
Хорошая работа Бено,

Всегда лучше подарить удочку, чем рыбу. Я очень рад, что смог помочь вам своими комментариями.

Что касается стоп-лосса, идея хорошая, но попробуйте рассмотреть ее в обратном направлении:

сначала установите стоп-лосс

во-вторых, установите размер сделки

Таким образом, вы будете подстраивать вход/выход системы под условия рынка, и не будете рисковать более чем X% от вашего счета, но выход будет зависеть от логики системы, а не от процента риска.

Добрый день, Калензо

Я получаю ошибку открытия ордера SELL: invalid stops с советником на демо и реальном счете и никакие сделки не открываются. но он хорошо работает на тестере и не имеет сообщений об ошибках.

EURUSD, Daily: modify #1 buy 0.01 EURUSD at 1.43348 sl: 1.43895 tp: 0.00000 ok

Разница SL 0.00547 пунктов.

Я проверил

MODE_FREEZELEVEL 0.0000

MODE_STOPLEVEL 0.0000

double lotSize = NormalizeDouble(Kellylot(),2);

double Bal = AccountFreeMargin();

double TV = MarketInfo(Symbol(), MODE_TICKVALUE);

double Risk = 0.3;

double MaxDD = 10;

double RiskCapital = Bal*MaxDD/100;

double RPT = Bal*Risk/100;

double stopLoss = NormalizeDouble((RPT/TV)*lotSize/pips2dbl,Digits);

double Positions = MathAbs(RiskCapital/RPT);

double SL;

//---- sell conditions

if(sellsig && ttime!=Time[0]){

double bid = NormalizeDouble(Bid, Digits);

SL = NormalizeDouble(Bid + stopLoss * pips2dbl, Digits);

res=OrderSend(symbol,OP_SELL,lotSize,bid,slippage * pips2dbl,SL,0,"Pivot_Sell",SpecificMagic,0,Red);

if( res<0 )

{

Print("Error opening SELL order : ",ErrorDescription(GetLastError()));

Print("Bid=" + DoubleToStr(bid,Digits) + " : SL=" + DoubleToStr(SL,Digits));

res=0;

}

else //now enter in the SL and TP via OrderModify to make compatible with ECN broker

{

if (OrderSelect(res, SELECT_BY_TICKET))

{

if (!OrderModify(res, Bid, SL, 0, 0, Red))

Print("Error modifying order");

}

}

ttime=Time[0];

return;

}

//---- buy conditions

if(buysig && ttime!=Time[0]) {

double ask = NormalizeDouble(Ask, Digits);

SL = NormalizeDouble(Ask - stopLoss * pips2dbl, Digits);

res=OrderSend(symbol,OP_BUY,lotSize,ask,slippage * pips2dbl,SL,0,"Pivot Buy",SpecificMagic,0,Blue);

if( res<0 )

{

Print("Error opening BUY order : ",ErrorDescription(GetLastError()));

Print("Ask=" + DoubleToStr(ask,Digits) + " : SL=" + DoubleToStr(SL,Digits));

res=0;

}

else //now enter in the SL and TP via OrderModify to make compatible with ECN broker

{

if (OrderSelect(res, SELECT_BY_TICKET))

{

if (!OrderModify(res, Ask, SL, 0, 0, Blue))

Print("Error modifying order");

}

}

ttime=Time[0];

return;

}

}

Я никогда не сталкивался с этим раньше.

Спасибо

Бено

 

Функция защелкивания/отщелкивания

Есть ли способ закодировать функцию фиксации/разблокировки в mq4. Можно зафиксировать бит true на основе условия и сохранять это значение до тех пор, пока оно не будет разблокировано другим условием.

cmfxtrader

 
Beno:
Добрый день, Калензо

Я получаю сообщение Error opening SELL order : invalid stops with the EA is on the demo and live account and no trades are opening. but it works well on the tester and has no error messages.

EURUSD, Daily: modify #1 buy 0.01 EURUSD at 1.43348 sl: 1.43895 tp: 0.00000 ok

Разница в SL 0.00547 пунктов.

Я проверил

MODE_FREEZELEVEL 0.0000

MODE_STOPLEVEL 0.0000

double lotSize = NormalizeDouble(Kellylot(),2);

double Bal = AccountFreeMargin();

double TV = MarketInfo(Symbol(), MODE_TICKVALUE);

double Risk = 0.3;

double MaxDD = 10;

double RiskCapital = Bal*MaxDD/100;

double RPT = Bal*Risk/100;

double stopLoss = NormalizeDouble((RPT/TV)*lotSize/pips2dbl,Digits);

double Positions = MathAbs(RiskCapital/RPT);

double SL;

//---- sell conditions

if(sellsig && ttime!=Time[0]){

double bid = NormalizeDouble(Bid, Digits);

SL = NormalizeDouble(Bid + stopLoss * pips2dbl, Digits);

res=OrderSend(symbol,OP_SELL,lotSize,bid,slippage * pips2dbl,SL,0,"Pivot_Sell",SpecificMagic,0,Red);

if( res<0 )

{

Print("Error opening SELL order : ",ErrorDescription(GetLastError()));

Print("Bid=" + DoubleToStr(bid,Digits) + " : SL=" + DoubleToStr(SL,Digits));

res=0;

}

else //now enter in the SL and TP via OrderModify to make compatible with ECN broker

{

if (OrderSelect(res, SELECT_BY_TICKET))

{

if (!OrderModify(res, Bid, SL, 0, 0, Red))

Print("Error modifying order");

}

}

ttime=Time[0];

return;

}

//---- buy conditions

if(buysig && ttime!=Time[0]) {

double ask = NormalizeDouble(Ask, Digits);

SL = NormalizeDouble(Ask - stopLoss * pips2dbl, Digits);

res=OrderSend(symbol,OP_BUY,lotSize,ask,slippage * pips2dbl,SL,0,"Pivot Buy",SpecificMagic,0,Blue);

if( res<0 )

{

Print("Error opening BUY order : ",ErrorDescription(GetLastError()));

Print("Ask=" + DoubleToStr(ask,Digits) + " : SL=" + DoubleToStr(SL,Digits));

res=0;

}

else //now enter in the SL and TP via OrderModify to make compatible with ECN broker

{

if (OrderSelect(res, SELECT_BY_TICKET))

{

if (!OrderModify(res, Ask, SL, 0, 0, Blue))

Print("Error modifying order");

}

}

ttime=Time[0];

return;

}

}

Я никогда не сталкивался с этим раньше.

Спасибо

Бено

Возможно, ваш стоп-лосс слишком близок. Попробуйте умножить значение стоп-лосса на 10. Это частая проблема, когда вы тестировали систему на 4-х значном брокере, а торгуете на 5-ти значном. Вы также можете протестировать систему на 5-значном брокере, но никогда не подключайтесь к брокеру (в автономном режиме), и тогда в metatrader будут старые настройки (от 4-значного).

Сначала с этой строки:

NormalizeDouble(Ask - stopLoss * pips2dbl, Digits);

Выведите это значение => stopLoss*pips2dbl

Тогда вы узнаете реальное значение стоп-лосса.

Если оно будет равно 20 или 10, то это означает, что вам нужно умножить его на значение Point

NormalizeDouble(Ask - (stopLoss * pips2dbl) *Point, Digits);

если будет 0.00009, то нужно умножить на 10, потому что должно быть 0.0009 (конечно, если вы хотите установить стоп-лосс 9 пунктов).

 
cmfxtrader:
Есть ли способ закодировать функцию защелкивания/отщелкивания в mq4. Вы бы фиксировали бит true на основе условия, и он бы сохранял это значение до тех пор, пока его не снимет другое условие. cmfxtrader

Я не уверен, правильно ли я вас понял. Вы хотите включить/выключить определенную часть ea(функцию) или вы хотите деактивировать функцию из ea A действием, предпринятым в ea B? Так или иначе, оба варианта возможны.

 

Преобразование денежной стоимости в цену (для расчета цели по прибыли)

Я хотел бы запрограммировать функцию, которая возвращает значение цены для заданной цели по прибыли корзины сделок, но у меня возникают трудности. Цель, которую я хотел бы достичь, представляет собой простую горизонтальную линию, которая должна быть нарисована на экране и обозначает цель прибыли. Однако цель прибыли является определяемой пользователем переменной в виде денежного значения, а не ценового. (например, цель = € 100 вместо цели = 1.2000).

Рутина, которую я имею на данный момент:

(Мой счет в евро!)

1) Допустим, я открываю несколько позиций на покупку по USDJPY (в случайных позициях для примера).

2) Я рассчитываю среднюю цену открытия корзины (допустим, 1.1500, опять же гипотетически) и отображаю горизонтальную линию, чтобы показать это.

3) У меня есть переменная с установленной целью прибыли: допустим, цель = € 100

4) Я могу успешно закрыть все открытые позиции, когда прибыль корзины >= цели.

Не хватает промежуточного шага. Мне нужна функция: double targetPrice(){}, которая возвращает целевую цену. Нарисовать горизонтальную линию не проблема: проблема в вычислении целевой цены!

TargetPrice = средняя цена открытия + денежная стоимость-цель (€100).

Итак, что я хотел бы знать: как я могу конвертировать денежное значение в пипсы. Таким образом, я могу добавить пипсы к средней цене, и вуаля, у меня есть моя целевая цена. Помните, что это также должно учитывать тот факт, что у меня EUR счет, а я торгую USDJPY. Думаю, здесь тоже есть подводные камни?

 

ECN SL не работает

Gidday

Я пытаюсь настроить советника, который будет работать на ECN, я понимаю, что SL и TP должны быть размещены / изменены, и я думаю, что настройка правильная, ордер открывается сейчас, но SL не размещается extern double StopLoss = 100; Любая помощь была бы замечательной.

//---- buy conditions

if(buysig && ttime!=Time[0]) {

ticket = OrderSend(Symbol(), OP_BUY, lotSize, MarketInfo(Symbol(), MODE_ASK), 2, 0, 0, "", 12345);

if(ticket > -1){

if (!OrderSelect(ticket, SELECT_BY_TICKET)) {

error_code = GetLastError();

Print("Error: " + ErrorDescription(error_code));

return(-1);

}

Print("order "+ticket+" successfully opened");

//now enter in the SL and TP via OrderModify to make compatible with ECN broker

SL = MarketInfo(Symbol(), MODE_ASK) - (StopLoss * pips2points);

Print("Ask = " + DoubleToStr(Ask,Digits) + " : SL = " + DoubleToStr(SL,Digits));

//round to nearest Tickvalue

SL = DoubleRound(SL, MarketInfo(Symbol(), MODE_TICKSIZE));

Print("SL rounded: " + SL);

if(!OrderModify(ticket, entry_price, SL, 0, Blue)) {

error_code = GetLastError();

Print("Error: " + ErrorDescription(error_code));

return(-1);

}

Print("Stoploss successfully set");

ttime=Time[0];

return(0);

}

}

}

//Tickvalue Rounding

double DoubleRound(double number, double step){

double mod = MathMod(number, step);

if(mod < step/2.0)

step = 0;

double rounded = number - mod + step;

return (rounded);

}
 

,,,,,,,,,,,,,.,,,,,,,,,

Файлы:
test_ea.txt  10 kb
aizig.ex4  10 kb