Помощь по кодированию... Как заставить индикатор фильтровать вместо алерта? - страница 8

 

Да ты мужик!

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

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

if(currentlong>minorts) {CloseOrder(OP_SELL); // Закрываем все ордера на продажу}

где currentlong - 20ema, а minorts - 150ema, так что открытая позиция была бы или ЕСТЬ короткой, которая закончилась, и теперь 20ema движется выше 150ema, что является сигналом закрытия короткой сделки.

и...

if (currentlong<minorts) {CloseOrder(OP_BUY); // Закрываем все ордера на покупку}

где currentlong - 20ema, а minorts - 150ema, так что открытая позиция была бы или ЕСТЬ длинной, которая прошла свой путь, и теперь 20ema движется ниже 150ema, что является сигналом закрытия длинной сделки.

Поэтому я могу просто поместить эти две линии

if (currentlong<minorts) {CloseOrder(OP_BUY); // Закрываем все ордера на покупку}

if (currentlong>minorts) {CloseOrder(OP_SELL); // Закрыть все ордера на продажу}

сразу после кода входа и перед всеми остальными закрытиями и трейлинг стопами вот так? и это будет работать?

if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES )) Print("SELL order opened : ",OrderOpenPrice());

}

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

return(0);

}

}

//+---------end of order entry-------------------------+

//+------close on moving average cross-----------------+

if(currentlong<minorts) {CloseOrder(OP_BUY);} // Close all buy orders}

if(currentlong>minorts) {CloseOrder(OP_SELL);} // Close all sell orders}

//+--------end of close on moving average cross--------+

//+-------------------------Trailing Stop Code------------------------------------+

for(cnt=0;cnt<total;cnt++) {

OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES);

if(OrderType()<=OP_SELL && OrderSymbol()==Symbol()) {

if(OrderType()==OP_BUY){

компилятор говорит следующее:

')' - неверное количество параметров C:\Program Files\Interbank FX Trader 4-live mini\experts\whatever.mq4 (85, 43)

')' - неверное количество параметров C:\Program Files\Interbank FX Trader 4-live mini\experts\whatever.mq4 (86, 44)

ему не нравятся эти строки. Мне кажется, что я не очень хорошо общаюсь.

 

это интересно, вдруг моя функция поиска в метаэдиторе работает?

bool OrderCloseBy( int ticket, int opposite, color Color=CLR_NONE)

Закрывает открытый ордер другим противоположным открытым ордером. Если функция работает успешно, возвращаемое значение равно true. В случае неудачи возвращаемое значение равно false. Чтобы получить подробную информацию об ошибке, вызовите GetLastError().

Параметры:

ticket - Уникальный номер билета заказа.

opposite - Уникальный номер противоположного билета заказа.

Цвет - Цвет стрелки закрытия на графике. Если параметр отсутствует или имеет значение CLR_NONE, стрелка закрытия не будет нарисована на графике.

Пример:

if(iRSI(NULL,0,14,PRICE_CLOSE,0)>75)

{

OrderCloseBy(order_id,opposite_id);

return(0);

}

Так что я представляю себе что-то вроде этого...

if(currentlong<minorts)

{

OrderCloseBy(order_id,opposite_id);

return(0);

}[/PHP]

thing is this doesn't distinguish what kind of position I'm into first, long or short. So if I put the opposite side of this with it...like this...

[PHP] if(currentlong>minorts)

{

OrderCloseBy(order_id,opposite_id);

return(0);

}

вместе они бы просто закрыли все, не так ли? Должно быть что-то еще... Я чувствую себя расстроенной, как ребенок, который еще не может говорить, чтобы передать полные предложения, когда у меня внутри есть законченные идеи, которые я не могу вытащить наружу.

 
elihayun:
Я забыл вот это
void CloseOrder(int ticket,double numLots,double close_price)

{

int CloseCnt, err;

// try to close 3 Times

CloseCnt = 0;

color clr = Violet;

if (OrderType() == OP_SELL)

clr = Orange;

while (CloseCnt < 3)

{

if (OrderClose(ticket,numLots,close_price,Slippage,clr))

{

CloseCnt = 3;

}

else

{

err=GetLastError();

Print(CloseCnt," Error closing order : (", err , ") " + ErrorDescription(err));

if (err > 0) CloseCnt++;

}

}

}

[/PHP]

and dont forget to add this line after #property link

[PHP]#property link "http://www.elihayun.com"

#include

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

 
Aaragorn:
Ты мужик!

so.... давайте посмотрим, правильно ли я это понимаю...

Итак, я могу просто вставить эти две строки

if (currentlong<minorts) {CloseOrder(OP_BUY); // Закрываем все ордера на покупку}

if (currentlong>minorts) {CloseOrder(OP_SELL); // Закрываем все ордера на продажу}

//+------close on moving average cross-----------------+

if(currentlong<minorts) {CloseOrder(OP_BUY);} //Закрываем все ордера на покупку}

if(currentlong>minorts) {CloseOrder(OP_SELL);} // Закрываем все ордера на продажу}

if(OrderType()==OP_BUY){[/PHP]

компилятор говорит следующее:

')' - неверное количество параметров C:\Program Files\Interbank FX Trader 4-live mini\experts\whatever.mq4 (85, 43)

')' - неверный подсчет параметров C:\Program Files\Interbank FX Trader 4-live mini\experts\whatever.mq4 (86, 44)

ему не нравятся эти строки. Мне кажется, что я не очень хорошо общаюсь.

Вы должны вызывать CloseOrders с s в конце, а не CloseOrder (который закрывает только один ордер).

 
Aaragorn:
Что это делает? Это что-то еще, что я должен загрузить, чтобы это было доступно для вызова? Я хочу понять, как она делает то, что делает, как она отличает длинные позиции от коротких. Я хочу научиться.

Он является частью MQL4 и содержит функцию ErrorDescription.

 
elihayun:
Это часть MQL4 и содержит функцию ErrorDescription

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

 

Этот фрагмент кода должен помочь вам в работе...

Конечно, вам придется изменить его в соответствии с вашими потребностями. Однако это должно послужить вам отправной точкой. Эта программа использует линию SMA1 в качестве трейлинг-стопа. Возьмите эту идею и посмотрите, что вы можете из нее сделать.

//these two lines within start()

SMA1 = iMA(NULL,TimePeriod,SlowPeriod,0,SlowMode,SlowPrice,1);

TrailingAlls(TrailStart, SMA1);

// trailing routine using the value of SMA1

void TrailingAlls(int start, double currvalue)

{

int profit;

double stoptrade;

double stopcal;

// if(stop==0) return;

int trade;

for(trade=OrdersTotal()-1;trade>=0;trade--)

{

if(!OrderSelect(trade,SELECT_BY_POS,MODE_TRADES))

continue;

if(OrderSymbol()!=Symbol()||OrderMagicNumber()!=MagicNumber)

continue;

if(OrderSymbol()==Symbol()&&OrderMagicNumber()==MagicNumber)

{

if(OrderType()==OP_BUY)

{

profit=NormalizeDouble((Bid-OrderOpenPrice())/Point,0);

if(profit<start)

continue;

stoptrade=OrderStopLoss();

// stopcal=Bid-(stop*Point);

stopcal=NormalizeDouble(currvalue, Digits);

if(stoptrade==0||(stoptrade!=0&&stopcal>stoptrade))

OrderModify(OrderTicket(),OrderOpenPrice(),stopcal,OrderTakeProfit(),0,Blue);

}//Long

if(OrderType()==OP_SELL)

{

profit=NormalizeDouble((OrderOpenPrice()-Ask)/Point,0);

if(profit<start)

continue;

stoptrade=OrderStopLoss();

// stopcal=Ask+(stop*Point);

stopcal=NormalizeDouble(currvalue, Digits);

if(stoptrade==0||(stoptrade!=0&&stopcal<stoptrade))

OrderModify(OrderTicket(),OrderOpenPrice(),stopcal,OrderTakeProfit(),0,Red);

}//Shrt

}

}//for

}

 

трейлинг-стоп может быть полезен, если я смогу разобраться в этом сначала....

Этот фрагмент, который дал мне elihayun, я думаю, может работать, если кто-то сможет понять, как заставить его реагировать на ma backcross и в правильном направлении. Я запутался в op_buy и op_sell, что есть что. и что использовать для закрытия длинных позиций, а что использовать для закрытия коротких позиций.

//+------close on moving average cross-----------------+

void CloseOrders(int op)

{

int tik[30], t = 0;

for(int i =0;i<OrdersTotal();i++){

if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)){

if(OrderSymbol()==Symbol() && MagicNum==OrderMagicNumber() && OrderType() == op){

tik[t] = OrderTicket(); t++;

}

}

}

for (i = 0; i<t; i++)

{

if(OrderSelect(tik,SELECT_BY_TICKET)){

double prc = Bid;

if (op == OP_SELL) prc = Ask;

CloseOrder(tik, OrderLots(), prc);

}

}

}

//+--------end of close on moving average cross--------+[/PHP]

I think I see that at this point in the code it has selected the orders by ticket and it's figuring out to set the close price based on the bid or the ask. So I'm not sure which is which for long or short positions. If the ticket is a long position that means it was opened at the ask price right? so it should close on the bid price? so this snippet is saying use the bid price to close so I assume that's for a long position. THEN it asks the

if (op == OP_SELL) prc = Ask;

so I assume this is the first place in this code where we now know if we are looking at a long or a short position ticket.

Then it moves immediately to close. But if I can put my closing criteria in here BEFORE it does that???

here it is as I received it...

for (i = 0; i<t; i++)

{

if(OrderSelect(tik,SELECT_BY_TICKET)){

double prc = Bid;

if (op == OP_SELL) prc = Ask;

CloseOrder(tik, OrderLots(), prc);

}[/PHP]

so what I'm thinking is that this is the place in the code where I should insert the moving average criteria to trigger the close for long or short positions. Something like this...

[PHP]for (i = 0; i<t; i++)

{

if(OrderSelect(tik,SELECT_BY_TICKET)){

double prc = Bid;

if (op == OP_SELL) prc = Ask;

if (prc == Bid && currentlong minorts);

CloseOrder(tik, OrderLots(), prc);

}

Will this do it? I think it might if I understand correctly..

Please tell me coders if this is correct??

I think this connects the direction of the moving average cross to the type of position that the ticket is identifed as being.

if the bid is to close long positions so we know the ticket is for a long position then it can close long positions if the currentlongema < minortsEMA because it knows that the ticket is for a long position and the 20ema has moved below the 150ema.

If the ask is for closing short positions and the ticket is identified as a short position because it wants to close at the ask price and the currentlongEMA has moved above the minortsEMA because it knows the ticket is for a short position and the 20ema has moved above the 150ema.

if that is correct will adding this line to the code,

if (prc == Bid && currentlong minorts)

stop it from closing UNLESS each ticket fits this criteria?

...that for the long position the 20ema150ema?

if that is ok then the logic for deciding to close long or short based on the emacrossback is ok and it's worth fixing these errors

I get these errors from the compiler...

[PHP]Compiling 'whatever.mq4'...

'(' - function definition unexpected C:\Program Files\Interbank FX Trader 4-live mini\experts\whatever.mq4 (85, 17)

'MagicNum' - variable not defined C:\Program Files\Interbank FX Trader 4-live mini\experts\whatever.mq4 (90, 40)

'op' - variable not defined C:\Program Files\Interbank FX Trader 4-live mini\experts\whatever.mq4 (90, 87)

'tik' - variable not defined C:\Program Files\Interbank FX Trader 4-live mini\experts\whatever.mq4 (91, 13)

't' - variable not defined C:\Program Files\Interbank FX Trader 4-live mini\experts\whatever.mq4 (91, 17)

't' - variable not defined C:\Program Files\Interbank FX Trader 4-live mini\experts\whatever.mq4 (91, 37)

't' - variable not defined C:\Program Files\Interbank FX Trader 4-live mini\experts\whatever.mq4 (96, 18)

'tik' - variable not defined C:\Program Files\Interbank FX Trader 4-live mini\experts\whatever.mq4 (98, 22)

'op' - variable not defined C:\Program Files\Interbank FX Trader 4-live mini\experts\whatever.mq4 (100, 14)

'tik' - variable not defined C:\Program Files\Interbank FX Trader 4-live mini\experts\whatever.mq4 (102, 21)

'cnt' - expression on global scope not allowed C:\Program Files\Interbank FX Trader 4-live mini\experts\whatever.mq4 (108, 5)

'cnt' - variable not defined C:\Program Files\Interbank FX Trader 4-live mini\experts\whatever.mq4 (108, 5)

'cnt' - expression on global scope not allowed C:\Program Files\Interbank FX Trader 4-live mini\experts\whatever.mq4 (108, 11)

'cnt' - variable not defined C:\Program Files\Interbank FX Trader 4-live mini\experts\whatever.mq4 (108, 11)

'total' - expression on global scope not allowed C:\Program Files\Interbank FX Trader 4-live mini\experts\whatever.mq4 (108, 15)

'total' - variable not defined C:\Program Files\Interbank FX Trader 4-live mini\experts\whatever.mq4 (108, 15)

'cnt' - expression on global scope not allowed C:\Program Files\Interbank FX Trader 4-live mini\experts\whatever.mq4 (108, 21)

'cnt' - variable not defined C:\Program Files\Interbank FX Trader 4-live mini\experts\whatever.mq4 (108, 21)

'{' - expression on global scope not allowed C:\Program Files\Interbank FX Trader 4-live mini\experts\whatever.mq4 (108, 28)

'i' - variable is already defined C:\Program Files\Interbank FX Trader 4-live mini\experts\whatever.mq4 (135, 11)

'}' - unbalanced parentheses C:\Program Files\Interbank FX Trader 4-live mini\experts\whatever.mq4 (165, 1)

16 error(s), 5 warning(s)

 

Предложение для всех членов клуба: не используйте процедуры "подсчета" для закрытия сделок. Например, не используйте что-то вроде этого:

for (i = 0; i<t; i++)

{

if(OrderSelect(tik,SELECT_BY_TICKET)){

double prc = Bid;

if (op == OP_SELL) prc = Ask;

CloseOrder(tik, OrderLots(), prc);

}

Если вы используете несколько ордеров, он не закроет последний ордер. Используйте процедуру "обратного отсчета". Вот моя дискуссия с разработчиками Metaquotes, когда я впервые наткнулся на этот раздражающий "баг".

http://www.metaquotes.net/forum/2018/

 
Maji:
Этот фрагмент кода должен помочь вам в работе...

Конечно, вам придется изменить его в соответствии с вашими собственными потребностями. Однако это должно послужить вам отправной точкой. Эта программа использует линию SMA1 в качестве трейлинг-стопа. Так что возьмите эту идею и посмотрите, что вы можете из нее сделать.

//these two lines within start()

SMA1 = iMA(NULL,TimePeriod,SlowPeriod,0,SlowMode,SlowPrice,1);

TrailingAlls(TrailStart, SMA1);

// trailing routine using the value of SMA1

void TrailingAlls(int start, double currvalue)

{

int profit;

double stoptrade;

double stopcal;

// if(stop==0) return;

int trade;

for(trade=OrdersTotal()-1;trade>=0;trade--)

{

if(!OrderSelect(trade,SELECT_BY_POS,MODE_TRADES))

continue;

if(OrderSymbol()!=Symbol()||OrderMagicNumber()!=MagicNumber)

continue;

if(OrderSymbol()==Symbol()&&OrderMagicNumber()==MagicNumber)

{

if(OrderType()==OP_BUY)

{

profit=NormalizeDouble((Bid-OrderOpenPrice())/Point,0);

if(profit<start)

continue;

stoptrade=OrderStopLoss();

// stopcal=Bid-(stop*Point);

stopcal=NormalizeDouble(currvalue, Digits);

if(stoptrade==0||(stoptrade!=0&&stopcal>stoptrade))

OrderModify(OrderTicket(),OrderOpenPrice(),stopcal,OrderTakeProfit(),0,Blue);

}//Long

if(OrderType()==OP_SELL)

{

profit=NormalizeDouble((OrderOpenPrice()-Ask)/Point,0);

if(profit<start)

continue;

stoptrade=OrderStopLoss();

// stopcal=Ask+(stop*Point);

stopcal=NormalizeDouble(currvalue, Digits);

if(stoptrade==0||(stoptrade!=0&&stopcal<stoptrade))

OrderModify(OrderTicket(),OrderOpenPrice(),stopcal,OrderTakeProfit(),0,Red);

}//Shrt

}

}//for

}

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

Причина, по которой я хочу сначала заставить работать emacrossback, в том, что он будет моим стоплоссом и стратегией выхода по умолчанию.

Как только это заработает, я добавлю такие вещи, как эта, чтобы увеличить прибыльность. Но поскольку я не могу иметь стоп-лосс, не испортив его, и поскольку я не хочу допускать огромных параметров стоп-лосса, я хочу сначала заставить работать закрытие кроссбэка по скользящей средней. Если у вас будет возможность проверить, что я сделал до сих пор с обратным закрытием, я буду благодарен за это.