//+------------------------------------------------------------------+ //| Dyraha.mq4 | //| Mr. Shytrik | //| kj | //+------------------------------------------------------------------+ extern double StopLoss = 200; //SL для открываемого ордера extern double TakeProfit = 39; //TP для открываемого ордера extern int Period_MA_1 = 11; // период MA 1 extern int Period_MA_2 = 31; // период MA 2 extern double Rastvor = 28.0; // растояние между МА extern double Lots = 0.1; // жестко заданное колличество лотов extern double Prots = 0.07; // процент свободных средств bool Work=true; // эксперт будет работать string Symb; // название финан. Инструмента //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ int start() { int Total, //колличество ордеров в окне Tip=-1, //тип выбранных ордеров (B=0; S=1) Ticket; //номер ордера double MA_1_t, //значение МА_1 текущее MA_2_t, //значение MA_2 текущее Lts, //колличество лотов открытом ордере Lot, //колличество лотов в выбраном ордере Min_lot, //минимальное колличество лотов Step, //шаг изменения лота Free, //текущие свободные средства One_lot, //стоимасть одного лота Price, //цена выбранного ордера SL, //SL выбранного ордера TP; //TP выбранного ордера bool Ans=false, //ответ сервера после закрытия Cls_B=false, //критерий для закрытия Buy Cls_S=false, //критерий для закрытия Sell Opn_B=false, //критерий для открытия Buy Opn_S=false; //критерий для открытия Sell //+------------------------------------------------------------------+ //|Предварительная обработка | //+------------------------------------------------------------------+ if (Bars1) //попался отложеный ордер { Alert ("Попался отлеженный ордер. Эксперт не работает."); return; //выход из start() } Total++; //счетчик рыночных ордеров if (Total>1) //не более одного ордера { Alert ("Несколько рыночных ордеров. Эксперт не работает."); return; //выход из start() } Ticket=OrderTicket(); //номер выбраного ордера Tip=OrderType(); //тип выбраного ордера Price=OrderOpenPrice(); //цена выбраного ордера SL=OrderStopLoss(); //SL выбианого ордера TP=OrderTakeProfit(); //TP выбраного ордера Lot=OrderLots(); //колличество лотов выбраного ордера } } //+------------------------------------------------------------------+ //|Торговые критерии | //+------------------------------------------------------------------+ MA_1_t=iMA(NULL,0,Period_MA_1,0,MODE_LWMA,PRICE_TYPICAL,0); //MA_1 MA_2_t=iMA(NULL,0,Period_MA_2,0,MODE_LWMA,PRICE_TYPICAL,0); //MA_2 //Если разница между MA1 и MA2 большая. Критерий открытия Buy. Критерий закрытия Sell if (MA_1_t>MA_2_t+Rastvor*Point) { Opn_B=true; Cls_S=true; } //Если разница между MA1 и MA2 большая. Критерий открытия Sell. Критерий закрытия Buy if (MA_1_t0) //если заданы лоты то с ним и работаем Lts=Lots; else //% свободных средств для открытия Lts=MathFloor(Free*Prots/One_lot/Step)*Step; if (LtsFree) //лот дороже свободного { Alert ("Не хватает денег на ", Lts, " лотов"); return; //выход из start() } //+------------------------------------------------------------------+ //|открытие ордеров | //+------------------------------------------------------------------+ while (true) //цикл открытия ордеров { if (Total==0 && Opn_B==true) //открытых ордеров нет. Есть критерий открытия Buy { RefreshRates(); //обновление данных SL=Bid-New_Stop(StopLoss)*Point; //вычисление SL открытия TP=Bid+New_Stop(TakeProfit)*Point; //вычисление TP открытия Alert ("Попытка открыть Buy. Ожидание ответа от сервера.."); Ticket=OrderSend(Symb, OP_BUY, Lts, Ask, 2, SL, TP); //открытие ордера Buy if (Ticket>0) //получилось { Alert ("Открыт ордер Buy", Ticket); return; //выход из start() } if (Fun_Error(GetLastError())==1) //обработка ошибки continue; //повторная попытка return; //выход из start() } if (Total==0 && Opn_S==true) //открытых ордеров нет. Есть критерий открытия Sell { RefreshRates(); //обновление данных SL=Bid-New_Stop(StopLoss)*Point; //вычисление SL открытия TP=Bid+New_Stop(TakeProfit)*Point; //вычисление TP открытия Alert ("Попытка открыть Sell. Ожидание ответа от сервера.."); Ticket=OrderSend(Symb, OP_SELL, Lts, Bid, 2, SL, TP); //открытие ордера Sell if (Ticket>0) //получилось { Alert ("Открыт ордер Sell", Ticket); return; //выход из start() } if (Fun_Error(GetLastError())==1) //обработка ошибки continue; //повторная попытка return; //выход из start() } break; //выход из while } return; //выход из start() } //+------------------------------------------------------------------+ //|функция обработки ошибок | //+------------------------------------------------------------------+ int Fun_Error(int Error) { switch (Error) { //преодолимые ошибки case 4: Alert ("Торговый сервер занят. Пробуем еще раз.."); Sleep(3000); //простое решение return(1); //выход из функции case 135: Alert("Цена изменилась. Пробуем еще раз.."); RefreshRates(); //обновим данные return(1); //выход из функции case 136: Alert ("Нет цен. Ждем новый тик"); while (RefreshRates()==false) //до нового тика Sleep(1); //задержка в цикле return(1); //выход из функции case 137: Alert ("Брокер занят. Пробуем еще раз"); Sleep(3000); return(1); case 146: Alert ("Подсистема торговли занята. Пробуем еще раз"); Sleep(500); return(1); //критические ошибки case 2: Alert("общая ошибка."); return(0); case 5: Alert("Старая версия терминала."); Work=false; return(0); case 65: Alert("Счет заблокирован."); Work=false; return(0); case 133: Alert("Торговля запрещена"); return(0); case 134: Alert("Недостаточно денег для совершения операции."); return(0); default: Alert("Возникла ошибка,", Error); return(0); } } //+------------------------------------------------------------------+ //|проверка стоп приказа | //+------------------------------------------------------------------+ int New_Stop (int Parametr) { int Min_Dist=MarketInfo(Symb, MODE_STOPLEVEL); //минимальная дистанция if (Parametr