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

 

Добавить позицию в этом советнике

Здравствуйте,

Сначала я должен извиниться, потому что английский не является моим родным языком.

Как я могу изменить этот советник, чтобы он добавлял позицию (покупка 0.1 лота) при закрытии бара, когда RSI больше 67, и продавал, когда RSI меньше 33?

Например:

время закрытия RSI

17:31 1.3855 69.3 ---> покупка 0.1

17:32 1.3858 70.5 ---> покупка 0.1

17:33 1.3849 66.8 ---> нет действий

17:34 1.3856 68.4 ---> покупка 0.1

Общая позиция +0.03

То же самое для короткой продажи.

//+------------------------------------------------------------------+

//| Этот MQL сгенерирован программой Expert Advisor Builder || Expert Advisor Builder.

//| Expert Advisor Builder для MetaTrader 4 | |

//| |

//| Ни при каких обстоятельствах автор не несет ответственности за какие-либо убытки. |

//| Используйте на свой страх и риск. |

//| |

//+------------------- НЕ УДАЛЯЙТЕ ЭТОТ ЗАГОЛОВОК --------------------+

#define SIGNAL_NONE 0

#define SIGNAL_BUY 1

#define SIGNAL_SELL 2

#define SIGNAL_CLOSEBUY 3

#define SIGNAL_CLOSESELL 4

#property copyright "Expert Advisor Builder"

#property link "http://sufx.core.t3-ism.net/ExpertAdvisorBuilder/"

extern int MagicNumber = 0;

extern bool SignalMail = False;

extern bool EachTickMode = False;

extern double Lots = 0.1;

extern int Slippage = 3;

extern bool UseStopLoss = False;

extern int StopLoss = 30;

extern bool UseTakeProfit = False;

extern int TakeProfit = 60;

extern bool UseTrailingStop = False;

extern int TrailingStop = 30;

int BarCount;

int Current;

bool TickCheck = False;

//+------------------------------------------------------------------+

//| функция инициализации эксперта |

//+------------------------------------------------------------------+

int init() {

BarCount = Bars;

if (EachTickMode) Current = 0; else Current = 1;

return(0);

}

//+------------------------------------------------------------------+

//| функция деинициализации эксперта |

//+------------------------------------------------------------------+

int deinit() {

return(0);

}

//+------------------------------------------------------------------+

//| функция запуска эксперта |

//+------------------------------------------------------------------+

int start() {

int Order = SIGNAL_NONE;

int Total, Ticket;

double StopLossLevel, TakeProfitLevel;

if (EachTickMode && Bars != BarCount) TickCheck = False;

Total = OrdersTotal();

Order = SIGNAL_NONE;

//+------------------------------------------------------------------+

//| Начало переменной |

//+------------------------------------------------------------------+

double Buy1_1 = iRSI(NULL, 0, 10, PRICE_CLOSE, Current + 0);

double Buy1_2 = 67;

double Sell1_1 = iRSI(NULL, 0, 10, PRICE_CLOSE, Current + 0);

double Sell1_2 = 33;

//+------------------------------------------------------------------+

//| Конец переменной |

//+------------------------------------------------------------------+

//Проверка позиции

bool IsTrade = False;

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

OrderSelect(i, SELECT_BY_POS, MODE_TRADES);

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

IsTrade = True;

if(OrderType() == OP_BUY) {

//Close

//+------------------------------------------------------------------+

//| Сигнал Begin(Exit Buy)|

//+------------------------------------------------------------------+

//+------------------------------------------------------------------+

//| Сигнал Конец(Выход из покупки)|

//+------------------------------------------------------------------+

if (Order == SIGNAL_CLOSEBUY && ((EachTickMode && !TickCheck) || (!EachTickMode && (Bars != BarCount)))) {

OrderClose(OrderTicket(), OrderLots(), Bid, Slippage, MediumSeaGreen);

if (SignalMail) SendMail("[Signal Alert]", "[" + Symbol() + "] " + DoubleToStr(Bid, Digits) + " Close Buy");

if (!EachTickMode) BarCount = Bars;

IsTrade = False;

continue;

}

//Трейлинг-стоп

if(UseTrailingStop && TrailingStop > 0) {

if(Bid - OrderOpenPrice() > Point * TrailingStop) {

if(OrderStopLoss() < Bid - Point * TrailingStop) {

OrderModify(OrderTicket(), OrderOpenPrice(), Bid - Point * TrailingStop, OrderTakeProfit(), 0, MediumSeaGreen);

if (!EachTickMode) BarCount = Bars;

continue;

}

}

}

} else {

//Close

//+------------------------------------------------------------------+

//| Signal Begin(Exit Sell) | Сигнал на продажу.

//+------------------------------------------------------------------+

//+------------------------------------------------------------------+

//| Сигнал End(Exit Sell)|

//+------------------------------------------------------------------+

if (Order == SIGNAL_CLOSESELL && ((EachTickMode && !TickCheck) || (!EachTickMode && (Bars != BarCount)))) {

OrderClose(OrderTicket(), OrderLots(), Ask, Slippage, DarkOrange);

if (SignalMail) SendMail("[Signal Alert]", "[" + Symbol() + "] " + DoubleToStr(Ask, Digits) + " Close Sell");

if (!EachTickMode) BarCount = Bars;

IsTrade = False;

continue;

}

//Трейлинг-стоп

if(UseTrailingStop && TrailingStop > 0) {

if((OrderOpenPrice() - Ask) > (Point * TrailingStop)) {

if((OrderStopLoss() > (Ask + Point * TrailingStop)) || (OrderStopLoss() == 0)) {

OrderModify(OrderTicket(), OrderOpenPrice(), Ask + Point * TrailingStop, OrderTakeProfit(), 0, DarkOrange);

if (!EachTickMode) BarCount = Bars;

continue;

}

}

}

}

}

}

//+------------------------------------------------------------------+

//| Сигнал Begin(Entry)|

//+------------------------------------------------------------------+

if (Buy1_1 > Buy1_2) Order = SIGNAL_BUY;

если (Sell1_1 < Sell1_2) Order = SIGNAL_SELL;

//+------------------------------------------------------------------+

//| Конец сигнала |

//+------------------------------------------------------------------+

//Покупка

if (Order == SIGNAL_BUY && ((EachTickMode && !TickCheck) || (!EachTickMode && (Bars != BarCount)))) {

if(!IsTrade) {

//Проверка свободной маржи

if (AccountFreeMargin() < (1000 * Lots)) {

Print("У нас нет денег. Свободная маржа = ", AccountFreeMargin());

return(0);

}

if (UseStopLoss) StopLossLevel = Ask - StopLoss * Point; else StopLossLevel = 0.0;

if (UseTakeProfit) TakeProfitLevel = Ask + TakeProfit * Point; else TakeProfitLevel = 0.0;

Ticket = OrderSend(Symbol(), OP_BUY, Lots, Ask, Slippage, StopLossLevel, TakeProfitLevel, "Buy(#" + MagicNumber + ")", MagicNumber, 0, DodgerBlue);

if (Ticket > 0) {

if (OrderSelect(Ticket, SELECT_BY_TICKET, MODE_TRADES)) {

Print("Открыт ордер BUY : ", OrderOpenPrice());

if (SignalMail) SendMail("[Signal Alert]", "[" + Symbol() + "] " + DoubleToStr(Ask, Digits) + " Open Buy");

} else {

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

}

}

if (EachTickMode) TickCheck = True;

if (!EachTickMode) BarCount = Bars;

return(0);

}

}

//Продажа

if (Order == SIGNAL_SELL && ((EachTickMode && !TickCheck) || (!EachTickMode && (Bars != BarCount)))) {

if(!IsTrade) {

//Проверка свободной маржи

if (AccountFreeMargin() < (1000 * Lots)) {

Print("У нас нет денег. Свободная маржа = ", AccountFreeMargin());

return(0);

}

if (UseStopLoss) StopLossLevel = Bid + StopLoss * Point; else StopLossLevel = 0.0;

if (UseTakeProfit) TakeProfitLevel = Bid - TakeProfit * Point; else TakeProfitLevel = 0.0;

Ticket = OrderSend(Symbol(), OP_SELL, Lots, Bid, Slippage, StopLossLevel, TakeProfitLevel, "Sell(#" + MagicNumber + ")", MagicNumber, 0, DeepPink);

if (Ticket > 0) {

if (OrderSelect(Ticket, SELECT_BY_TICKET, MODE_TRADES)) {

Print("Открыт ордер SELL : ", OrderOpenPrice());

if (SignalMail) SendMail("[Signal Alert]", "[" + Symbol() + "] " + DoubleToStr(Bid, Digits) + " Open Sell");

} else {

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

}

}

if (EachTickMode) TickCheck = True;

if (!EachTickMode) BarCount = Bars;

return(0);

}

}

if (!EachTickMode) BarCount = Bars;

return(0);

}

//+------------------------------------------------------------------+

Большое спасибо за помощь

Panurgo

 

Как остановить торговлю после получения прибыли за текущий день?

Здравствуйте.

У меня проблема. Я кодирую советника.

Когда прибыль за день составляет 20 PIP, советник не должен открывать ордера до следующего дня.

Пожалуйста, помогите мне.

Спасибо

fxbeginner

 
fxbeginner:
Привет.

У меня есть проблема. Я кодирую советника.

Когда профит 20 PIP дня взят, советник не должен открывать ордера до следующего дня.

Помогите пожалуйста.

Идея заключается в том, чтобы не разрешать торговлю после первого ордера дня. После функции ordersend() поставьте "trade = false;".

Затем сбросьте разрешение на торговлю каждый новый день:

if(timeprev!=iTime(Symbol(),PERIOD_D1,0)) { //---- Это новый день

timeprev = iTime(Symbol(),PERIOD_D1,0);

trade = true; }

Затем, когда вы проверяете свой сигнал:

if(trade) { здесь ваше торговое условие }

Просто пример ...

FerruFx

 

Скрытые ордера

Как мне закодировать советника, чтобы скрыть все стоп-ордера на покупку или продажу от любопытных глаз брокеров. Текущий советник имеет ордера Buy Stops и Sell Stops отложенные ордера.

Спасибо

LF

 
LazyForex:
Как мне написать советника, чтобы скрыть все стоп-ордера на покупку или продажу от любопытных глаз брокеров. Текущий советник имеет ордера Buy Stops и Sell Stops отложенные ордера.

Спасибо

LF

Запишите значения buystop и sellstop внутри советника, как только цена пересечет уровень buystop, отправьте ордер на покупку, и наоборот для sellstop.

 
Devil2000:
Запишите значения buystop и sellstop внутри советника, как только цена пересечет уровень buystop, отправьте ордер на покупку, и наоборот для sellstop.

Спасибо. Отправил вам сообщение в PM

 

Попросить советника прекратить работу

Привет всем,

Я почти закончил свой первый советник после почти 7 дней проб и ошибок, вырезания и вставки и многочасовых исследований.....

Может кто-нибудь подскажет мне, как сделать функцию выхода или остановки советника?

Я хочу, чтобы советник удалял все текущие и отложенные сделки и выходил после достижения 10,000 в эквити. Ниже приведена часть кода на данный момент:

bool StopTrade;

int total = OrdersTotal(), cnt = 0, ExitAtEquity=10000;

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

{

OrderSelect(0,SELECT_BY_POS,MODE_TRADES);

if (AccountEquity ()== ExitAtEquity)//(TimeCurrent()- OrderOpenTime() >= ActiveMinutes*60 )

{if(OrderType()==OP_BUY)

OrderClose(OrderTicket(),OrderLots(),Bid,3,Red);

if(OrderType()==OP_SELL)

OrderClose(OrderTicket(),OrderLots(),Ask,3,Red);

if(OrderType()>OP_SELL)

OrderDelete(OrderTicket());

StopTrade=true;}

}

if (dclose==dopen && OrdersTotal() < ConcurrentTrades && StopTrade != true)

Как вы можете видеть, советник смотрит на эквити, а затем устанавливает значение bool переменной StopTrade в true. Затем советник подтверждает команду и не обрабатывает ничего при значении StopTrade != true в течение одного цикла, но затем значение bool переменной StopTrade сбрасывается, и торговля продолжается.

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

Во-вторых, есть ли функция, которую я могу использовать, чтобы просто сказать советнику выйти из системы?

Любая помощь будет высоко оценена.

 

Что не так с этим кодом?

Может ли кто-нибудь сказать мне, почему я генерирую ошибку с этой командой в моем советнике?

if(OrderSelect(bTicket,SELECT_BY_TICKET)==true)

buyOrder=OrderType();

else

Print("OrderSelect returned the error of ",GetLastError());

bTicket is assigned in this prior line:

bTicket=OrderSend(Symbol(),OP_BUYSTOP,Lots,buyPoint,0,sl,buy_tp,"Script entry",0);

if(bTicket<=0) Print("Error = ",GetLastError());

else Print("ticket = ",bTicket);
My pending order is placed and returns the ticket number as assigned to bTicket, but then bTicket doesn't work in my OrderSelect(). I get an error 0 returned. I tried referencing by SELECT_BY_POS and assigning the returned ticket number to bTicket and it worked fine, but there's no way of knowing what the position number of all of my orders will be just be running the script. Any help is greatly appreciated.
 

Перемещение моего сообщения не помогло.

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

 

Что не так с этим кодом?

Может ли кто-нибудь сказать мне, почему я генерирую ошибку с этой командой в моем советнике?

if(OrderSelect(bTicket,SELECT_BY_TICKET)==true)

buyOrder=OrderType();

else

Print("OrderSelect returned the error of ",GetLastError());

bTicket is assigned in this prior line:

bTicket=OrderSend(Symbol(),OP_BUYSTOP,Lots,buyPoint,0,sl,buy_tp,"Script entry",0);

if(bTicket<=0) Print("Error = ",GetLastError());

else Print("ticket = ",bTicket);

Мой отложенный ордер размещается и возвращает номер билета, присвоенный bTicket, но затем bTicket не работает в моем OrderSelect(). Я получаю ошибку 0. Я пробовал ссылаться на SELECT_BY_POS и присваивать возвращаемый номер тикета bTicket, и это работало нормально, но нет никакого способа узнать, каким будет номер позиции всех моих ордеров, просто запустив скрипт. Любая помощь будет высоко оценена.