Привет, ребята, я был бы признателен за вашу помощь, пожалуйста?!
Вот проблема: я хотел бы частично закрыть свою позицию, когда быстрый сточ достигает перепроданности или перекупленности, а остальную часть позиции закрыть вручную. Казалось бы, легкая работа, но!!! Достигнув уровня, советник закрывает один лот и сразу за ним второй лот. Как мне остановить закрытие второй части?
Заранее спасибо,
Аволеоо
Например, я изменил OrderLots() на 0,01, и предположим, что я войду в рынок с 0,02.
вот код:
// -------------------------------------------------------------- -----
//| Этот MQL создан с помощью Expert Advisor Builder |
//|
http://sufx.core.t3-ism.net/ExpertAdvisorBuilder/|
//| |
//| Ни при каких обстоятельствах автор не будет нести ответственность за какой-либо ущерб. |
//| Используйте на свой риск. |
//| |
// ------------------- НЕ УДАЛЯТЬ ЭТОТ ЗАГОЛОВОК --------------------
#define SIGNAL_NONE 0
#define SIGNAL_BUY 1
#define SIGNAL_SELL 2
#define SIGNAL_CLOSEBUY 3
#define SIGNAL_CLOSESELL 4
#property copyright Конструктор советников
# ссылка на свойство http://sufx.core.t3-ism.net/ExpertAdvisorBuilder/
внешний интервал MagicNumber = 0;
extern bool SignalMail = False;
extern bool EachTickMode = True;
внешние двойные лоты = 0,01;
внешнее внутреннее проскальзывание = 3;
extern bool UseStopLoss = False;
внешний интервал StopLoss = 30;
extern bool UseTakeProfit = False;
extern int TakeProfit = 60;
extern bool UseTrailingStop = False;
внешний интервал TrailingStop = 30;
интервал BarCount;
внутренний текущий;
логическое значение TickCheck = False;
// -------------------------------------------------------------- -----
//| функция инициализации эксперта |
// -------------------------------------------------------------- -----
init () {
BarCount = Бары;
если (EachTickMode) Текущий = 0; иначе Текущий = 1;
возврат (0);
}
// -------------------------------------------------------------- -----
//| функция экспертной деинициализации |
// -------------------------------------------------------------- -----
интервал deinit () {
возврат (0);
}
// -------------------------------------------------------------- -----
//| функция экспертного запуска |
// -------------------------------------------------------------- -----
целое начало () {
интервал Заказ = SIGNAL_NONE;
инт Всего, Билет;
двойной StopLossLevel, TakeProfitLevel;
if (EachTickMode Bars != BarCount) TickCheck = False;
Итого = Всего заказов();
Заказ = SIGNAL_NONE;
// -------------------------------------------------------------- -----
//| Переменная Начало |
// -------------------------------------------------------------- -----
double CloseBuy1_1 = iStochastic(NULL, 0, 8, 5, 5, MODE_SMA, 0, MODE_MAIN, Current 0);
двойной CloseBuy1_2 = 80;
double CloseSell1_1 = iStochastic(NULL, 0, 8, 5, 5, MODE_SMA, 0, MODE_MAIN, Current 0);
двойной CloseSell1_2 = 20;
// -------------------------------------------------------------- -----
//| Конец переменной |
// -------------------------------------------------------------- -----
//Проверить позицию
bool IsTrade = Ложь;
for (int i = 0; i lt; Total; i ) {
OrderSelect(i, SELECT_BY_POS, MODE_TRADES);
if(OrderType() lt;= OP_SELL OrderSymbol() == Symbol()) {
ИсТрейд = Истина;
если(ТипЗаказа() == OP_BUY) {
//Закрывать
// -------------------------------------------------------------- -----
//| Сигнал Начало(Выход Купить) |
// -------------------------------------------------------------- -----
if (CloseBuy1_1 gt;= CloseBuy1_2) Ордер = SIGNAL_CLOSEBUY;
// -------------------------------------------------------------- -----
//| Конец сигнала (выход из покупки) |
// -------------------------------------------------------------- -----
if (Order == SIGNAL_CLOSEBUY ((EachTickMode !TickCheck) || (!EachTickMode (Bars != BarCount)))) {
OrderClose(OrderTicket(), 0.01, Bid, Slippage, MediumSeaGreen);
if (SignalMail) SendMail([Signal Alert], [ Symbol() ] DoubleToStr(Bid, Digits) Close Buy);
if (!EachTickMode) BarCount = Bars;
IsTrade = Ложь;
continue;
}
//Трейлинг-стоп
if(UseTrailingStop TrailingStop gt; 0) {
if(Bid - OrderOpenPrice() gt; Point * TrailingStop) {
if(OrderStopLoss() lt; Bid - Point * TrailingStop) {
OrderModify(OrderTicket(), OrderOpenPrice(), Bid - Point * TrailingStop, OrderTakeProfit(), 0,
Медиумморезелен);
if (!EachTickMode) BarCount = Bars;
Продолжать;
}
}
}
} еще {
//Закрывать
// -------------------------------------------------------------- -----
//| Начало сигнала (выход из продажи) |
// -------------------------------------------------------------- -----
if (CloseSell1_1 lt;= CloseSell1_2) Ордер = SIGNAL_CLOSESELL;
// -------------------------------------------------------------- -----
//| Конец сигнала (выход из продажи) |
// -------------------------------------------------------------- -----
if (Order == SIGNAL_CLOSESELL ((EachTickMode !TickCheck) || (!EachTickMode (Bars != BarCount)))) {
OrderClose(OrderTicket(), 0.01, Ask, Slippage, DarkOrange);
if (SignalMail) SendMail([Signal Alert], [ Symbol() ] DoubleToStr(Ask, Digits) Close Sell);
if (!EachTickMode) BarCount = Bars;
IsTrade = Ложь;
Продолжать;
}
//Трейлинг-стоп
if(UseTrailingStop TrailingStop gt; 0) {
if((OrderOpenPrice() - Ask) gt; (Point * TrailingStop)) {
if((OrderStopLoss() gt; (Ask Point * TrailingStop)) || (OrderStopLoss() == 0)) {
OrderModify(OrderTicket(), OrderOpenPrice(), Ask Point * TrailingStop, OrderTakeProfit(), 0,
Темно-оранжевый);
if (!EachTickMode) BarCount = Bars;
Продолжать;
}
}
}
}
}
}
// -------------------------------------------------------------- -----
//| Сигнал Начало(Вход) |
// -------------------------------------------------------------- -----
// -------------------------------------------------------------- -----
//| Сигнал Конец |
// -------------------------------------------------------------- -----
//Купить
if (Order == SIGNAL_BUY ((EachTickMode !TickCheck) || (!EachTickMode (Bars != BarCount)))) {
если(!Торговля) {
//Проверяем свободную маржу
if (AccountFreeMargin() lt; (1000 * лотов)) {
Print(У нас нет денег. Свободная маржа = , AccountFreeMargin());
возврат (0);
}
if (UseStopLoss) StopLossLevel = Ask - StopLoss * Point; иначе 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);
если (Билет gt; 0) {
если (OrderSelect(Билет, SELECT_BY_TICKET, MODE_TRADES)) {
Print(Открыт ордер на ПОКУПКУ : , OrderOpenPrice());
if (SignalMail) SendMail([Signal Alert], [ Symbol() ] DoubleToStr(Ask, Digits) Open Buy);
} еще {
Print(Ошибка открытия ордера на ПОКУПКУ: , GetLastError());
}
}
если (EachTickMode) TickCheck = True;
if (!EachTickMode) BarCount = Bars;
возврат (0);
}
}
//Продавать
if (Order == SIGNAL_SELL ((EachTickMode !TickCheck) || (!EachTickMode (Bars != BarCount)))) {
если(!Торговля) {
//Проверяем свободную маржу
if (AccountFreeMargin() lt; (1000 * лотов)) {
Print(У нас нет денег. Свободная маржа = , AccountFreeMargin());
возврат (0);
}
if (UseStopLoss) StopLossLevel = Bid StopLoss * Point; иначе StopLossLevel = 0.0;
if (UseTakeProfit) TakeProfitLevel = Bid - TakeProfit * Point; иначе TakeProfitLevel = 0.0;
Ticket = OrderSend(Symbol(), OP_SELL, Lots, Bid, Slippage, StopLossLevel, TakeProfitLevel, Sell(# MagicNumber
), MagicNumber, 0, DeepPink);
если (Билет gt; 0) {
если (OrderSelect(Билет, SELECT_BY_TICKET, MODE_TRADES)) {
Print(Открыт ордер на ПРОДАЖУ: , OrderOpenPrice());
if (SignalMail) SendMail([Signal Alert], [ Symbol() ] DoubleToStr(Bid, Digits) Open Sell);
} еще {
Print(Ошибка открытия ордера SELL: , GetLastError());
}
}
если (EachTickMode) TickCheck = True;
if (!EachTickMode) BarCount = Bars;
возврат (0);
}
}
if (!EachTickMode) BarCount = Bars;
возврат (0);
}
// -------------------------------------------------------------- -----