//+------------------------------------------------------------------+ //| MartLock1 | //+------------------------------------------------------------------+ #property copyright "Dmitriy Epshteyn" #property link "setkafx@mail.ru" #property version "1.00" #property strict extern string A1 = "Настройки индикаторов MA и RSI"; extern int PeriodMA_slow = 30; // Период медленной MA extern int PeriodMA_fast = 20; // Период быстрой МА extern int ma_shift_slow =0; // Сдвиг медленной средней скользящей extern int ma_shift_fast =0; // Сдвиг быстрой средней скользящей extern int ma_method_slow = 1; // Метод усреднения медленной средней скользящей extern int ma_method_fast = 1; // Метод усреднения быстрой средней скользящей extern int ma_index = 0; // Номер бара (МА), с которого берутся показатели средних скользящих // метод усреднения // 0 - Простое усреднение // 1 - Экспоненциальное усреднение // 2 - Сглаженное усреднение // 3 - Линейно-взвешенное усреднение extern int applied_price_slow = 0; // Используемая цена (0-закрытия, 1-открытия...) медленной средней скользящей extern int applied_price_fast = 0; // Используемая цена (0-закрытия, 1-открытия...) быстрой средней скользящей // используемая цена //0-Цена закрытия //1-Цена открытия //2-Максимальная за период цена //3-Минимальная за период цена //4-Медианная цена, (high+low)/2 //5-Типичная цена, (high+low+close)/3 //6-Средневзвешенная цена, (high+low+close+close)/4 extern int RSI_Period = 14; // Период индикатора RSI extern int RSI_applied_price = 0; // Используемая цена (0-закрытия, 1-открытия...) индикатора RSI extern int RSI_up = 70; // Верхний уровень RSI extern int RSI_down = 30; // Нижний уровень RSI extern string A2 = "Настройки сетки ордеров"; extern int Timer_Minutes = 10; // Минимальное кол-во минут, которое должно пройти после закрытия последнего ордера, чтобы мог открыться новый extern double Lots = 0.01; // Лот ордеров extern double Koef = 2; // Множитель лота ордеров extern int Step = 10; // "Минимальная охранная зона" между ордерами в пунктах extern int Max_Orders = 5; // Максимальное кол-во однотипных ордеров extern int TP = 10; // Тейк профит усредняющей сетки ордеров extern int Shag = 4; // Шаг модификации тейк профита пачки ордеров extern string A3 = "Настройки локкирующих ордеров"; extern int Step_Lock = 10; // Расстояние в пунктах, на котором от сетки открывается локкирующий ордер extern double Koef_Lock = 2; // Множитель лота лок. ордера, на который умножается сумма лотов противоположных ордеров extern int Max_Lock_Orders = 1; // Кол-во попыток открыть лок. ордер extern int SL_Lock = 10; // Стоп лосс локкирующего ордера extern string A4 = "Настройки закрытия сетки ордеров по убытку и по суммарному тралу профита"; extern double Loss_Close = 50; // Убыток в валюте депозита, при котором происходит закрытие ордеров в текущем торговом цикле extern double Max_Profit_Tral = 30; // Максимальная сумма профита торгового цикла, при достижении которой начинает работать трал суммарного профита extern double Trailing_Value = 10; // Если максимально зафиксированная сумма профита уменьшится на эту сумму, все ордера - закрываем. extern string A5 = "Прочее"; extern int Slip = 30; // Проскальзывание extern int Magic = 1; // Номер ордеров extern int Magic2 = 2; // Номер локкирующих ордеров extern bool Info_Panel = true; // Вкл/выкл информационную панель //+------------------------------------------------------------------+ //| Expert initialization function | //+------------------------------------------------------------------+ int OnInit() { //--- //--- return(INIT_SUCCEEDED); } //+------------------------------------------------------------------+ //| Expert deinitialization function | //+------------------------------------------------------------------+ void OnDeinit(const int reason) { //--- } //+------------------------------------------------------------------+ //| Expert tick function | //+------------------------------------------------------------------+ void OnTick() { //--- datetime first_time = TimeCurrent(); // время первого открытого рыночного ордера double opB=2000000; double opS=0; double KrainiyB =0; // рыночный бай с наибольшей ценой открытия double KrainiyS =2000000; // рыночный сел с наименьшей ценой открытия double LotBsum=0; // сумма лотов бай ордеров double LotSsum=0; // сумма лотов селл ордеров double LotBmax=0; // макс лот бай ордеров double LotSmax=0; // макс лот селл ордеров double ProfitB=0, ProfitS=0; double bMod = Ask; double sMod = Bid; static double zoneb = NormalizeDouble(Step*Point,Digits); static double zones = NormalizeDouble(Step*Point,Digits); int bZone=0, sZone=0; double stops = MarketInfo(Symbol(),MODE_STOPLEVEL)*Point; int b=0,s=0,n=0,bs=0,ss=0,b1=0,s1=0, total=OrdersTotal(); for(int i1=total-1; i1>=0; i1--) if(OrderSelect(i1, SELECT_BY_POS)) if(OrderSymbol()==Symbol() ) if (OrderMagicNumber()==Magic) { if(OrderType()==OP_BUY) {b++;n++; ProfitB+=OrderProfit()+OrderSwap()+OrderCommission(); LotBsum+=OrderLots(); double openB =OrderOpenPrice (); double LotB=OrderLots(); if(openBKrainiyB) {KrainiyB=openB;} // крайний бай ордер if(LotB>LotBmax) {LotBmax=LotB;} // максимальный лот сетки бай ордеров if ((bMod-OrderOpenPrice()<=zoneb && bMod-OrderOpenPrice()>=0) || (OrderOpenPrice()-bMod<=zoneb && OrderOpenPrice()-bMod>=0)) {bZone++;} if (OrderOpenTime()>Time[0]) {b1++;} if (OrderOpenTime()opS) {opS=openS;} // внутренний селл ордер if(openSLotSmax) {LotSmax=LotS;} // максимальный лот сетки селл ордеров if ((OrderOpenPrice()-sMod<=zones && OrderOpenPrice()-sMod>=0) || (sMod-OrderOpenPrice()<=zones && sMod-OrderOpenPrice()>=0)) {sZone++;} if (OrderOpenTime()>Time[0]) {s1++;} if (OrderOpenTime()0) {Lot_b=NormalizeDouble(MathCeil((LotBmax*Koef)/lots_step)*lots_step,lots_digits);} if (Lot_b0) {Lot_s=NormalizeDouble(MathCeil((LotSmax*Koef)/lots_step)*lots_step,lots_digits);} if (Lot_sMarketInfo(Symbol(),MODE_MAXLOT)) {Lot_b=MarketInfo(Symbol(),MODE_MAXLOT);} if (Lot_s>MarketInfo(Symbol(),MODE_MAXLOT)) {Lot_s=MarketInfo(Symbol(),MODE_MAXLOT);} double One_Lot=MarketInfo(Symbol(),MODE_MARGINREQUIRED); bool open_buy = true, open_sell = true; if (AccountFreeMargin()10) {Alert(Symb," Не удалось закрыть все сделки, осталось еще ",n1);return(0);} Sleep(1000); RefreshRates(); } return(1); //______________________________________________________________________________________________________________________ }