extern int Magic = 317317;
extern int SL = 380;
extern int TP = 17;
extern double lots = 0.01;
extern bool tr_stops = false; // Передвигаем стоп-лос
extern bool profittral = false; // Передвигаем только при профите ордера
extern int tr_zona = 7; // Зона количества свечей для трала
extern bool lokk_Pos = true;
extern int lokk_zone = 19;
extern int lokk_level = 110;
extern int enlarge_lot = 5;
//------- Глобальные переменные советника -------------------------------------+
double St_b, St_s, Tk_b, Tk_s, Pr_b, Pr_s, ExpTime;
string koment;
int init() {
return(0);
}
int deinit() {
return(0);
}
// ========================================================
// =================== НАЧИНАЕМ РАБОТУ ====================
// ========================================================
int start() {
RefreshRates();
int Cur_time = (Hour()*100) + Minute(); // Текущее время часы потом мнуты без разделителя
Comment("\n"," ==== советник РАБОТАЕТ ==== определяет точки ВХОДА ==== ",
"\n"," ======================",
"\n"," таймфрейм = ", Period(), " инструмент ", Symbol(),
"\n"," идентификатор МАГИК = ", Magic,
"\n"," ======================",
"\n"," связь с сервером = ", IsConnected(), " ВРЕМЯ сервера ", Cur_time,
"\n"," счет зарегистрирован в компании ", AccountCompany(),
"\n"," ======================");
Sleep(500);
if (Cur_time == J_time) {
Pr_b = NormalizeDouble(High[iHighest(NULL,0,MODE_HIGH,J_zone,0)], Digits);
Pr_s = NormalizeDouble(Low[iLowest(NULL,0,MODE_LOW,J_zone,0)], Digits);
ExpTime = iTime(NULL,0,0)+86400;
koment = " азиатская сессия ";
Print("**** СРАБОТАЛА азиатская сессия ****");
order(Pr_b, Pr_s, ExpTime, koment);
}
if (Cur_time == E_time) {
Pr_b = NormalizeDouble(High[iHighest(NULL,0,MODE_HIGH,E_zone,0)], Digits);
Pr_s = NormalizeDouble(Low[iLowest(NULL,0,MODE_LOW,E_zone,0)], Digits);
ExpTime = iTime(NULL,0,0)+86400;
koment = " европейская сессия ";
Print("**** СРАБОТАЛА европейская сессия ****");
order(Pr_b, Pr_s, ExpTime, koment);
}
if (Cur_time == A_time) {
Pr_b = NormalizeDouble(High[iHighest(NULL,0,MODE_HIGH,A_zone,0)], Digits);
Pr_s = NormalizeDouble(Low[iLowest(NULL,0,MODE_LOW,A_zone,0)], Digits);
ExpTime = iTime(NULL,0,0)+86400;
koment = " американская сессия ";
Print("**** СРАБОТАЛА американская сессия ****");
order(Pr_b, Pr_s, ExpTime, koment);
}
if (Cur_time == Je_time) {
Pr_b = NormalizeDouble(High[iHighest(NULL,0,MODE_HIGH,Je_zone,0)], Digits);
Pr_s = NormalizeDouble(Low[iLowest(NULL,0,MODE_LOW,Je_zone,0)], Digits);
ExpTime = iTime(NULL,0,0)+86400;
koment = " азия/европа бокс ";
Print("**** СРАБОТАЛ азия/европа бокс ****");
order(Pr_b, Pr_s, ExpTime, koment);
}
if (Cur_time == Ea_time) {
Pr_b = NormalizeDouble(High[iHighest(NULL,0,MODE_HIGH,Ea_zone,0)], Digits);
Pr_s = NormalizeDouble(Low[iLowest(NULL,0,MODE_LOW,Ea_zone,0)], Digits);
ExpTime = iTime(NULL,0,0)+86400;
koment = " европа/америка бокс ";
Print("**** СРАБОТАЛ европа/америка бокс ****");
order(Pr_b, Pr_s, ExpTime, koment);
}
if (Cur_time == Aj_time) {
Pr_b = NormalizeDouble(High[iHighest(NULL,0,MODE_HIGH,Aj_zone,0)], Digits);
Pr_s = NormalizeDouble(Low[iLowest(NULL,0,MODE_LOW,Aj_zone,0)], Digits);
ExpTime = iTime(NULL,0,0)+86400;
koment = " америка/азия бокс ";
Print("**** СРАБОТАЛ америка/азия бокс ****");
order(Pr_b, Pr_s, ExpTime, koment);
}
for (int i=0; i<=OrdersTotal(); i++) {
if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)==true) {
if (OrderMagicNumber()==Magic && OrderSymbol()==Symbol()) {
if (tr_stops && OrderType()<2) TrailingPositions(); // Условие для трала ордера
if (lokk_Pos && OrderType()<2) LokkPositions(); // Условие для локирования ордера
}}}
return(0);
}
// ========================================================
// ============ ФУНКЦИЯ ПОДГОТОВКИ К РАБОТЕ ===============
// ========================================================
void order(double Pr_b, double Pr_s, double ExpTime, string koment) {
RefreshRates();
if(AccountFreeMargin()<(1000*lots)) Alert("We have no money. Free Margin = ", AccountFreeMargin());
PlaySound("tick.wav");
int luft = MarketInfo(Symbol(),MODE_STOPLEVEL) + 3;
int spro_b = 0;
int spro_s = 0;
bool tic_b = false;
bool tic_s = false;
while(!tic_b){
if (Pr_b <= Ask) Pr_b = NormalizeDouble(Ask + luft*Point, Digits);
St_b = NormalizeDouble(Pr_b - SL*Point, Digits);
Tk_b = NormalizeDouble(Pr_b + TP*Point, Digits);
if(IsTradeAllowed()) tic_b = OrderSend(Symbol(), OP_BUYSTOP, lots, Pr_b, 2, St_b, Tk_b, koment, Magic, ExpTime, Green);
if(!tic_b) Print("попытка == ", spro_b, " /Ошибка #",GetLastError());
spro_b = spro_b +1;
if(spro_b > 9) break;
PlaySound("expert.wav");
Sleep(500);
}
while(!tic_s){
if (Pr_s >= Bid) Pr_s = NormalizeDouble(Bid - luft*Point, Digits);
St_s = NormalizeDouble(Pr_s + SL*Point, Digits);
Tk_s = NormalizeDouble(Pr_s - TP*Point, Digits);
if(IsTradeAllowed()) tic_s = OrderSend(Symbol(), OP_SELLSTOP, lots, Pr_s, 2, St_s, Tk_s, koment, Magic, ExpTime, Red);
if(!tic_s) Print("попытка == ", spro_s, " /Ошибка #",GetLastError());
spro_s = spro_s +1;
if(spro_s > 9) break;
PlaySound("expert.wav");
Sleep(500);
}
if(!tic_b || !tic_s) Alert(" НЕ установлен ордер == Ошибка # ",GetLastError());
if (tic_b && tic_s) {
PlaySound("ok.wav");
Comment("\n"," ==== советник РАБОТАЕТ ==== программная задержка вычислений ====",
"\n"," ======================",
"\n"," установлен ордер на покупку с тикетом = ", tic_b, " попыток установки = ", spro_b,
"\n"," установлен ордер на продажу с тикетом = ", tic_s, " попыток установки = ", spro_s,
"\n"," ======================");
Print("установлен ордер на покупку с тикетом = ", tic_b, " попыток = ", spro_b);
Print("установлен ордер на продажу с тикетом = ", tic_s, " попыток = ", spro_s);
Sleep(60000);
}
return(0);
}
// ========================================================
// ============ РАБОТА С РЫНОЧНЫМИ ОРДЕРАМИ ===============
// ========================================================
void TrailingPositions() {
RefreshRates();
bool fm = false;
if (!tr_stops) return(0);
if (profittral) {
if (OrderProfit() < 0) return(0);
}
Comment("\n"," ==== советник РАБОТАЕТ ==== выполняет СОПРОВОЖДЕНИЕ ордеров ==== ",
"\n"," ======================",
"\n"," таймфрейм = ", Period(), " инструмент ", Symbol(),
"\n"," идентификатор МАГИК = ", Magic,
"\n"," ======================",
"\n"," будем ТРАЛИТЬ ордер = ", OrderTicket(), " (", OrderComment(), ") ", OrderProfit(),
"\n"," ======================");
Sleep(500);
if (OrderType()==OP_BUY) {
double Pr_sb = NormalizeDouble(Low[iLowest(NULL, 0, MODE_LOW, tr_zona, 1)], Digits);
double StLb = NormalizeDouble(Pr_sb - (4*Point), Digits);
if(IsTradeAllowed())fm = OrderModify(OrderTicket(), OrderOpenPrice(), StLb, OrderTakeProfit(), 0, Green);
if (!fm) Print("Ошибка модификации ордера #",GetLastError());
if (fm) PlaySound("wait.wav");
return(0);
}
if (OrderType()==OP_SELL) {
double Pr_ss = NormalizeDouble(High[iHighest(NULL, 0, MODE_HIGH, tr_zona, 1)], Digits);
double StLs = NormalizeDouble(Pr_ss + (4*Point), Digits);
if(IsTradeAllowed())fm = OrderModify(OrderTicket(), OrderOpenPrice(), StLs, OrderTakeProfit(), 0, Red);
if (!fm) Print("Ошибка модификации ордера #",GetLastError());
if (fm) PlaySound("wait.wav");
return(0);
} }
// ========================================================
// ============ ФУНКЦИЯ ЛОКИРОВАНИЯ ОРДЕРОВ ===============
// ========================================================
void LokkPositions() {
RefreshRates();
Comment("\n"," ==== советник РАБОТАЕТ ==== в зоне ЛОКИРОВАНИЯ ордеров ==== ");
bool tic_lb = false;
bool tic_ls = false;
bool fm_lb = false;
bool fm_ls = false;
if (!lokk_Pos) return(0);
if (OrderProfit() > 0) return(0);
//Comment("\n"," ==== советник РАБОТАЕТ ==== проверяет УБЫТОЧНЫЕ ордера ==== ",
// "\n"," ======================",
// "\n"," таймфрейм = ", Period(), " инструмент ", Symbol(),
// "\n"," идентификатор МАГИК = ", Magic,
// "\n"," ======================",
// "\n"," возможно ЛОКИРОВАТЬ ордер = ", OrderTicket(), " ", OrderType(), " ", OrderProfit(),
// "\n"," ======================");
//Sleep(500);
int MagicLokk = OrderTicket();
double SL_Lokk = OrderStopLoss();
for (int i=0; i<=OrdersTotal(); i++) {
if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)==true) {
if (OrderMagicNumber()==MagicLokk) {
//Comment("\n"," ==== советник РАБОТАЕТ ==== проверяет ЛОКИРОВАНИЕ ордеров ==== ",
// "\n"," ======================",
// "\n"," таймфрейм = ", Period(), " инструмент ", Symbol(),
// "\n"," идентификатор МАГИК = ", Magic,
// "\n"," ======================",
// "\n"," ордер = ", MagicLokk, " уже локирован ордером = ", OrderTicket(),
// "\n"," ======================");
// Sleep(500);
return(0);
} } }
//Comment("\n"," ==== советник РАБОТАЕТ ==== проверяет ЛОКИРОВАНИЕ ордеров ==== ",
// "\n"," ======================",
// "\n"," таймфрейм = ", Period(), " инструмент ", Symbol(),
// "\n"," идентификатор МАГИК = ", Magic,
// "\n"," ======================",
// "\n"," ордер = ", MagicLokk, " еще НЕ локирован ",
// "\n"," ======================");
//Sleep(500);
if(OrderSelect(MagicLokk, SELECT_BY_TICKET)==true) {
//Comment("\n"," ==== советник РАБОТАЕТ ==== условие ЛОКИРОВАНИЯ ордеров ==== ",
// "\n"," ======================",
// "\n"," таймфрейм = ", Period(), " инструмент ", Symbol(),
// "\n"," идентификатор МАГИК = ", Magic,
// "\n"," ======================",
// "\n"," ордер = ", MagicLokk,
// "\n"," ======================");
//Sleep(500);
//Comment("\n"," ==== советник РАБОТАЕТ ==== в зоне ЛОКИРОВАНИЯ ордеров ==== ");
if (OrderType()==OP_BUY) {
if (((OrderOpenPrice() - Ask)/Point)>lokk_zone) {
double Price_lokkb = NormalizeDouble(OrderOpenPrice() - lokk_level*Point, Digits);
double lot_lokkb = NormalizeDouble(lots*enlarge_lot, 2);
double TP_lokkb = NormalizeDouble (OrderOpenPrice() - ((lokk_level/(enlarge_lot+1)*enlarge_lot)*Point), Digits);
if(IsTradeAllowed()) tic_lb = OrderSend(Symbol(), OP_BUYSTOP, lot_lokkb, Price_lokkb, 2, SL_Lokk, TP_lokkb, " локировка позиции ", MagicLokk, 0, Yellow);
if(!tic_lb) Alert("попытка локировки 1 == Ошибка #",GetLastError());
PlaySound("expert.wav");
Sleep(500);
if(IsTradeAllowed()) fm_lb = OrderModify(MagicLokk, OrderOpenPrice(), OrderStopLoss(), TP_lokkb, 0, Yellow);
if(!tic_lb) Alert("попытка локировки 2 == Ошибка #",GetLastError());
PlaySound("expert.wav");
Comment("\n"," ==== советник РАБОТАЕТ ==== ВЫПОЛНИЛ ЛОКИРОВАНИЕ ордеров ==== ",
"\n"," ======================",
"\n"," таймфрейм = ", Period(), " инструмент ", Symbol(),
"\n"," идентификатор МАГИК = ", Magic,
"\n"," идентификатор МАГИК ЛОКА = ", MagicLokk,
"\n"," ======================",
"\n"," ИЗМЕНЕН ордер = ", OrderTicket(), OrderType(), " новый TP = ", TP_lokkb,
"\n"," УСТАНОВЛЕН лок на уровне = ", Price_lokkb, " TP = ", TP_lokkb,
"\n"," ======================");
Sleep(500);
return(0);
} }
if (OrderType()==OP_SELL) {
if (((Bid - OrderOpenPrice())/Point)>lokk_zone) {
double Price_lokks = NormalizeDouble(OrderOpenPrice() + lokk_level*Point, Digits);
double lot_lokks = NormalizeDouble(lots*enlarge_lot, 2);
double TP_lokks = NormalizeDouble (OrderOpenPrice() + ((lokk_level/(enlarge_lot+1)*enlarge_lot)*Point), Digits);
if(IsTradeAllowed()) tic_ls = OrderSend(Symbol(), OP_SELLSTOP, lot_lokks, Price_lokks, 2, SL_Lokk, TP_lokks, " локировка позиции ", MagicLokk, 0, Yellow);
if(!tic_ls) Alert("попытка локировки 1 == Ошибка #",GetLastError());
PlaySound("expert.wav");
Sleep(500);
if(IsTradeAllowed()) fm_ls = OrderModify(MagicLokk, OrderOpenPrice(), OrderStopLoss(), TP_lokks, 0, Yellow);
if(!tic_ls) Alert("попытка локировки 2 == Ошибка #",GetLastError());
PlaySound("expert.wav");
Comment("\n"," ==== советник РАБОТАЕТ ==== ВЫПОЛНИЛ ЛОКИРОВАНИЕ ордеров ==== ",
"\n"," ======================",
"\n"," таймфрейм = ", Period(), " инструмент ", Symbol(),
"\n"," идентификатор МАГИК = ", Magic,
"\n"," идентификатор МАГИК ЛОКА = ", MagicLokk,
"\n"," ======================",
"\n"," ИЗМЕНЕН ордер = ", OrderTicket(), OrderType(), " новый TP = ", TP_lokks,
"\n"," УСТАНОВЛЕН лок на уровне = ", Price_lokks, " TP = ", TP_lokks,
"\n"," ======================");
Sleep(500);
return(0);
} } } }
В левом верхнем углу экрана у меня есть табло,где отражаются этапы работы Агента.Когда какой-то ордер уходит в минус,Агент пишет,что работает в зоне локирования ордеров.Если движение в минус продолжается,то на каком-то этапе Агент пишет ,что установлен локирующий ордер такой-то ,с такими-то параметрами,и у такого-то ордера изменен тейк-профит.Но на самом деле лок не устанавливается и изменения тейк -профита не происходит.И эта писанина мигает многократно.Это я и называю сигналом.