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

 

...

Посмотрите этот пост: https: //www.mql5.com/en/forum/174385/page12

Там была похожая проблема, и вы можете использовать ту же функцию countOpenedOnACurrentBar

чтобы ограничить открытие только одной сделки на кроссовер.

dipu:
Привет друзья, я новичок. У меня есть простая стратегия. Я просто скальпирую, когда EMA пересекается. Я просто беру только одну сделку в каждом пересечении. Мне нужен код, который может взять только одну сделку в каждом пересечении EMA. Пожалуйста......
 

Просто код пересечения EMA нужен........

Большое спасибо, MLADEN...

Я только что проверил вашу функцию. Она выглядит хорошо. Мне также нужна помощь. Мне нужно добавить значение RSI(50) с EMA кроссовером.... как я могу...?

Пары: GBP/USD И EUR/USD

Таймфрейм: 15мин, 1 час и выше;

-------------------------------

ПОКУПАТЬ: EMA 5 Пересечение EMA 12 в сторону повышения, RSI больше 50

ПРОДАЖА: EMA 5 Пересечение EMA 12 в сторону понижения, RSI меньше 50

(только одна сделка в каждом пересечении ЕМА).

Жду ответа. Пожалуйста.......

 

Вы можете сделать это несколькими способами.

Один способ (непосредственно в советнике) может быть примерно таким:

double macdc = iMA(NULL,0,EmaFast,0,MODE_SMA,EmaPrice,0)-iMA(NULL,0,EmaSlow,0,MODE_SMA,EmaPrice,0);

double macdp = iMA(NULL,0,EmaFast,0,MODE_SMA,EmaPrice,1)-iMA(NULL,0,EmaSlow,0,MODE_SMA,EmaPrice,1);

double rsi = iRSI(NULL,0,RsiPeriod,RsiPrice,0);

if (macdc*macdp<0) // change of sign, signal for a new order

{

if (macdc>0 && rsi>50) ... code for buy

if (macdc<0 && rsi<50) ... code for sell

}

[/PHP]

The good thing about it is that it is small (the code) and does not take any significant process time. The bad thing when using conditions like that in an EA is that you have to imagine (and test, test, test ...) what is it going to perform like. I prefer making a "binary" indicator with which the it is very easy to visually inspect if the condition has any logic in it and if it is going to be profitable or not and then call that indicator (using iCustom()) from the EA.

Here is how would the indicator with the above conditions look like in "binary" form :

У вас есть вся необходимая информация: серая линия - это "тренд". Зеленая и красная линии могут быть использованы как точки входа и повторного входа. Вы можете "оптимизировать" его визуально в одно мгновение, а затем использовать эти параметры в советнике (гораздо быстрее "оптимизировать" визуально, чем мучительное "измени параметры, запусти, посмотри, что получилось, а затем то же самое снова и снова". И это довольно легко вызвать из советника. Это будет выглядеть следующим образом:

[PHP] double trendc = iCustom(NULL,0, "ema + rsi binary",EmaFast,EmaSlow,EmaPrice,RsiPeriod,RsiPrice,2,0);

double trendp = iCustom(NULL,0, "ema + rsi binary",EmaFast,EmaSlow,EmaPrice,RsiPeriod,RsiPrice,2,1);

if (trendc!=trendp)

{

if (trendc== 1) ... сигнал на покупку

if (trendc==-1) ... сигнал на продажу

}

В общем и целом, я всегда рекомендую использовать индикатор из Ea. Вы можете даже изменить логику Ea, не трогая его, просто изменив и доработав код ваших индикаторов, и тогда советник станет "просто" каркасом для ордеров и управления капиталом (поскольку сигналы поступают от индикатора), что, на мой взгляд, является наиболее эффективным способом использования советников. Прикрепляя индикатор, вы решаете, какой способ (прямой или "по индикатору") вы хотите использовать в своем советнике.

PS: в приведенных выше примерах тесты проводятся на текущем (еще открытом) баре. Если вы хотите тестировать закрытый бар, замените 0 и 1 на 1 и to в вызовах iCustom(), iMa() и iRSI().

dipu:
Большое спасибо, МЛАДЕН...

Я только что проверил вашу функцию. Она выглядит хорошо. Мне также нужна помощь. Мне нужно добавить значение RSI(50) с EMA кроссовером.... как я могу...?

Пары: GBP/USD И EUR/USD

Таймфрейм: 15мин, 1 час и выше;

-------------------------------

ПОКУПАТЬ: EMA 5 Пересечение EMA 12 в сторону повышения, RSI больше 50

ПРОДАЖА: EMA 5 Пересечение EMA 12 в сторону понижения, RSI меньше 50

(только одна сделка в каждом пересечении EMA)

Я жду ответа. Пожалуйста.......
Файлы:
 

Баланс на 1-е число месяца?

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

Я пытаюсь получить процентную разницу между балансом на 1-е число и текущим балансом.

У меня есть общая процентная разница.

(Баланс - Депозит)/Депозит*100

Я хотел бы добавить разницу за месяц.

(Баланс - 1-е)/1-е*100

Любые подсказки или реальный код были бы замечательны.

Спасибо

Beno

 

Еще раз спасибо, МАЛАДЕН...

Спасибо за ваш индикатор и совет. Я просто пытался следовать вашим инструкциям. Но так как я не умею работать с mq4, у меня ничего не получилось.

ВОТ МОЙ..............

------------------------------------

-----------------------------------

#property indicator_separate_window

#property indicator_buffers 3

#property indicator_color1 LimeGreen

#property indicator_color2 PaleVioletRed

#property indicator_color3 DarkGray

#property indicator_width1 2

#property indicator_width2 2

#property indicator_minimum -1.1

#property indicator_maximum +1.1

extern int EmaFast = 5;

extern int EmaSlow = 12;

extern int EmaPrice = PRICE_CLOSE;

extern int RsiPeriod = 14;

extern int RsiPrice = PRICE_CLOSE;

double signup[];

double signdn[];

double trend[];

extern double TakeProfit=15.0;

extern double Lots=0.1;

//------------------------------------------------------------------

//

//------------------------------------------------------------------

int init()

{

return(0);

}

//------------------------------------------------------------------

//

//------------------------------------------------------------------

int start()

{

int count,counted_bars=IndicatorCounted();

if(counted_bars < 0) return(-1);

if(counted_bars>0) counted_bars--;

int limit = MathMin(Bars-counted_bars,Bars-1);

int cnt, ticket, total;

double trendc = iCustom(NULL,0, "ema + rsi binary",EmaFast,EmaSlow,EmaPrice,RsiPeriod,RsiPrice,2,0);

double trendp = iCustom(NULL,0, "ema + rsi binary",EmaFast,EmaSlow,EmaPrice,RsiPeriod,RsiPrice,2,1);

if (trendc!=trendp)

total = OrdersTotal();

if (total < 1)

{

if (trendc== 1) //... сигнал на покупку

{

ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,3,0,Ask+TakeProfit*Point, "My EA",12345,0,Green);

if(ticket>0)

{

if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)) Print("Открыт ордер BUY : ",OrderOpenPrice());

}

else Print("Ошибка при открытии ордера BUY : ",GetLastError());

return(0);

}

if (trendc==-1) //... сигнал на продажу

{

ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,3,0,Bid-TakeProfit*Point, "My EA",12345,0,Red);

if(ticket>0)

{

if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)) Print(" Открытордер SELL: ",OrderOpenPrice());

}

else Print("Ошибка при открытии ордера SELL : ",GetLastError());

return(0);

}

}

return(0);

}

---------------------------------------

---------------------------------------

Мне нужна ваша помощь....

Я извинился перед вами, если я больше аспекта к вам, как вы упали беспокоить. Но я действительно беспомощен...

Я жду ответа. Пожалуйста.......

 

...

Попробуйте использовать что-то вроде этого:

double balanceAtStartOfMonth(int forMonth)

{

double current = AccountBalance();

datetime startTime = iTime(NULL,PERIOD_MN1,forMonth);

//

//

//

//

//

for (int k=OrdersHistoryTotal()-1; k>=0; k--)

{

if (!OrderSelect(k,SELECT_BY_POS,MODE_HISTORY)) break;

if (OrderCloseTime()<startTime) continue;

current -= (OrderProfit()+OrderSwap());

}

return(current);

}

forMonth - месяц назад, за который вы хотите увидеть баланс 0 - текущий месяц. Затем вычисляется, каким был баланс на первый день нужного месяца. Функция будет учитывать депозиты и снятие средств (OrderType() == 6), поэтому она должна работать нормально.

Beno:
Gidday Я сижу здесь и пытаюсь понять, есть ли способ извлечь начальный баланс на 1-е число месяца для отображения на экране.

Я пытаюсь получить процентную разницу между балансом на 1-е число и текущим балансом.

У меня есть общая процентная разница.

(Баланс - Депозит)/Депозит*100

Я хотел бы добавить разницу за месяц.

(Баланс - 1-е)/1-е*100

Любые подсказки или реальный код были бы замечательны.

Спасибо

Бено
 

...

Вы не можете управлять ордерами из индикатора. Вы можете управлять ордерами только из скриптов или советников (именно этот случай вы ищете). Код из вашего поста - это индикатор.

Примеры, которые я разместил, должны быть использованы из советника (насколько я понял, у вас уже есть советник, в котором вы хотите ограничить количество ордеров и хотите проверить условия ema и rsi для входов).

dipu:
Спасибо еще раз, МАЛАДЕН...

Спасибо за ваш индикатор и совет. Я просто пытаюсь следовать вашим инструкциям. Но так как я неумело работаю на mq4, у меня ничего не получилось.

ВОТ МОЙ..............

------------------------------------

-----------------------------------

#property indicator_separate_window

#property indicator_buffers 3

#property indicator_color1 LimeGreen

#property indicator_color2 PaleVioletRed

#property indicator_color3 DarkGray

#property indicator_width1 2

#property indicator_width2 2

#property indicator_minimum -1.1

#property indicator_maximum +1.1

extern int EmaFast = 5;

extern int EmaSlow = 12;

extern int EmaPrice = PRICE_CLOSE;

extern int RsiPeriod = 14;

extern int RsiPrice = PRICE_CLOSE;

double signup[];

double signdn[];

double trend[];

extern double TakeProfit=15.0;

extern double Lots=0.1;

//------------------------------------------------------------------

//

//------------------------------------------------------------------

int init()

{

return(0);

}

//------------------------------------------------------------------

//

//------------------------------------------------------------------

int start()

{

int count,counted_bars=IndicatorCounted();

if(counted_bars < 0) return(-1);

if(counted_bars>0) counted_bars--;

int limit = MathMin(Bars-counted_bars,Bars-1);

int cnt, ticket, total;

double trendc = iCustom(NULL,0, "ema + rsi binary",EmaFast,EmaSlow,EmaPrice,RsiPeriod,RsiPrice,2,0);

double trendp = iCustom(NULL,0, "ema + rsi binary",EmaFast,EmaSlow,EmaPrice,RsiPeriod,RsiPrice,2,1);

if (trendc!=trendp)

total = OrdersTotal();

if (total < 1)

{

if (trendc== 1) //... сигнал на покупку

{

ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,3,0,Ask+TakeProfit*Point, "My EA",12345,0,Green);

if(ticket>0)

{

if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)) Print("Открыт ордер BUY : ",OrderOpenPrice());

}

else Print("Ошибка при открытии ордера BUY : ",GetLastError());

return(0);

}

if (trendc==-1) //... сигнал на продажу

{

ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,3,0,Bid-TakeProfit*Point, "My EA",12345,0,Red);

if(ticket>0)

{

if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)) Print("Открыт ордер SELL : ",OrderOpenPrice());

}

else Print("Ошибка при открытии ордера SELL : ",GetLastError());

return(0);

}

}

return(0);

}

---------------------------------------

---------------------------------------

Мне нужна ваша помощь....

Я извинился перед вами, если я больше аспекта к вам, как вы упали беспокоить. Но я действительно беспомощен...

Я жду ответа. Пожалуйста.......
 

Спасибо за ответ, MLADEN,

Извините, я думаю, вы сказали мне поместить этот код в новый советник.

Я просто не понял ваш ответ.

ДА. Вы правы....

У меня есть советник и я хотел его модифицировать. С некоторым новым условием.......

мое условие :

------------------------------------------------------

ПОКУПКА: EMA 5 пересекает EMA 12 в сторону повышения, RSI больше 50

ПРОДАЖА: EMA 5 пересекает EMA 12 в сторону понижения, RSI меньше 50

Выход: с небольшим тейк-профитом

(только одна сделка в каждом пересечении ЕМА)

вот мой советник.....

---------------------

---------------------

extern double Lots=0.1;

extern int TakeProfit=5;

extern int StopLoss=5;

extern int RSIPos=50;

extern int RSINeg=50;

extern int Slippage=2;

extern int abandon=101;

datetime bartime=0;

int bartick=0;

double p;

int cnt=0;

int OrdersPerSymbol=0;

double bullMA3=0;

double bearMA7=0;

double RSI=0;

bool RSIPOS=0;

bool RSINEG=0;

double TP;

double SL;

int init()

{

if (Symbol()=="AUDUSD") {TakeProfit= 60; StopLoss= 23; abandon=103;}

if (Symbol()=="EURAUD") {TakeProfit= 95; StopLoss=141; abandon=33;}

if (Symbol()=="EURCHF") {TakeProfit= 81; StopLoss= 77; abandon=97;}

if (Symbol()=="EURGBP") {TakeProfit= 11; StopLoss= 77; abandon=108;}

if (Symbol()=="EURJPY") {TakeProfit= 38; StopLoss= 75; abandon=183;}

if (Symbol()=="EURUSD") {TakeProfit=35; StopLoss= 35; abandon=5;}

if (Symbol()=="GBPCHF") {TakeProfit= 79; StopLoss= 98; abandon=113;}

if (Symbol()=="GBPJPY") {TakeProfit= 13; StopLoss= 98; abandon=117;}

if (Symbol()=="GBPUSD") {TakeProfit= 55; StopLoss= 100; abandon=69;}

if (Symbol()=="USDCAD") {TakeProfit= 66; StopLoss= 76; abandon=106;}

if (Symbol()=="USDCHF") {TakeProfit=117; StopLoss= 78; abandon=111;}

if (Symbol()=="USDJPY") {TakeProfit= 53; StopLoss= 74; abandon=110;}

}

int deinit()

{

}

int start()

{

p=Point;

// Проверка ошибок и подсчет баров

if(AccountFreeMargin()<(200*Lots)) {Print("-----NO MONEY"); return(0);}

if(Bars<100) {Print("-----NO BARS "); return(0);}

if(bartime!=Time[0]) {bartime=Time[0]; bartick++;}

bullMA3=iMA(Symbol(),0,3,0,MODE_EMA,PRICE_CLOSE,1);

bearMA7=iMA(Symbol(),0,7,0,MODE_EMA,PRICE_CLOSE,1);

RSI=iRSI(Symbol(),0,2,PRICE_CLOSE,2);

if(RSI>RSIPos) {RSIPOS=true; RSINEG=false;}

if(RSI<RSINeg) {RSIPOS=false; RSINEG=true;}

OrdersPerSymbol=0;

for(cnt=OrdersTotal();cnt>=0;cnt--)

{

OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES);

if( OrderSymbol()==Symbol() )

{

OrdersPerSymbol++;

}

}

if(OrdersPerSymbol==0)

{

if(bullMA3>(bearMA7+p) && RSINEG)

{

SL=Ask-(StopLoss*p);

TP=Ask+(TakeProfit*p);

OrderSend(Symbol(),OP_BUY,Lots,Ask,Slippage,SL,TP, "BUY "+CurTime(),0,0,White);

bartick=0;

}

if(bullMA3<(bearMA7-p) && RSIPOS)

{

SL=Bid+(StopLoss*p);

TP=Bid-(TakeProfit*p);

OrderSend(Symbol(),OP_SELL,Lots,Bid,Slippage,SL,TP, "SELL "+CurTime(),0,0,Red);

bartick=0;

}

}

if(OrdersPerSymbol==1 && bartick==abandon)

{

if(OrderType()==OP_BUY)

{

OrderClose(OrderTicket(),Lots,Bid,Slippage,White);

SL=Bid+(StopLoss*p);

TP=Bid-(TakeProfit*p);

OrderSend(Symbol(),OP_SELL,Lots,Bid,Slippage,SL,TP, "SELL "+CurTime(),0,0,Red);

bartick++;

}

if(OrderType()==OP_SELL)

{

OrderClose(OrderTicket(),Lots,Ask,Slippage,Red);

SL=Ask-(StopLoss*p);

TP=Ask+(TakeProfit*p);

OrderSend(Symbol(),OP_BUY,Lots,Ask,Slippage,SL,TP, "BUY "+CurTime(),0,0,White);

bartick++;

}

}

for(cnt=0;cnt<OrdersTotal();cnt++)

{

OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES);

if( OrderSymbol()==Symbol() )

{

if(OrderType()==OP_BUY)

{

if (OrderMagicNumber()==0)

{

if( Bid-OrderOpenPrice() > 3*Point )

{

OrderClose(OrderTicket(),Lots,Bid,0,White);

return(0);

}

}

}

if(OrderType()==OP_SELL)

{

if (OrderMagicNumber()==0)

{

if( OrderOpenPrice()-Ask > (3*Point) )

{

OrderClose(OrderTicket(),Lots,Ask,0,Red);

return(0);

}

}

}

}

}

return(0);

}

-------------------

---------------------

Как я могу изменить это....? Жду ответа. Пожалуйста.......

 

dipu

Что касается входов, этот работает нормально.

Теперь позаботьтесь о выходах, поскольку, как вы написали, вы закрываете ордера слишком рано. Также 5 цифр брокера теперь тоже убраны, и входы работают как надо. Период по умолчанию для rsi установлен на 14 (я не знал, какой период вы хотите использовать, в коде вы используете период 2, но это, вероятно, слишком коротко). Периоды Ema по умолчанию 5 и 12. Кроме того, сейчас тестируется закрытый бар (он ждет, пока бар закроется, и если сигнал на покупку или продажу существует, он вводит ордер).

Файлы:
dipu.mq4  5 kb
 

Спасибо за ответ, МЛАДЕН,

извините, что не совсем понятная информация.......

ПОКУПАТЬ: EMA 5 пересекает EMA 12 в сторону повышения, RSI[14] больше 50

ПРОДАЖА: EMA 5 пересекает EMA 12 в сторону понижения, RSI[14] меньше 50

Выход: с маленьким TP/Sl....(5pip)

(только одна сделка в каждом пересечении ЕМА).

Я просто пробую и сообщу вам результат.

Может ли он также модифицироваться... или нет...

Еще раз спасибо за вашу помощь.....

Причина обращения: