//+------------------------------------------------------------------+ //| Moving Average.mq4 | //| Copyright © 2005, MetaQuotes Software Corp. | //| http://www.metaquotes.net/ | //+------------------------------------------------------------------+ #define MAGICMA 20050610 extern double Lots = 0.05; extern double MaximumRisk = 0.05; extern double DecreaseFactor = 3; extern double MovingPeriod = 14; extern double MovingShift = 2; extern double MovingPeriod1 = 4; extern double MovingShift1 = 2; extern double Tral_Stop =500; //| Calculate open positions | //+------------------------------------------------------------------+ int CalculateCurrentOrders(string symbol) { int buys=0,sells=0; //---- for(int i=0;i0) return(buys); else return(-sells); } //+------------------------------------------------------------------+ //| Calculate optimal lot size | //+------------------------------------------------------------------+ double LotsOptimized() { double lot=Lots; int orders=HistoryTotal(); // history orders total int losses=0; // number of losses orders without a break //---- select lot size lot=NormalizeDouble(AccountFreeMargin()*MaximumRisk/1000.0,1); //---- calcuulate number of losses orders without a break if(DecreaseFactor>0) { for(int i=orders-1;i>=0;i--) { if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY)==false) { Print("Error in history!"); break; } if(OrderSymbol()!=Symbol() || OrderType()>OP_SELL) continue; //---- if(OrderProfit()>0) break; if(OrderProfit()<0) losses++; } if(losses>1) lot=NormalizeDouble(lot-lot*losses/DecreaseFactor,1); } //---- return lot size if(lot<0.1) lot=0.1; return(lot); } //+------------------------------------------------------------------+ //| Check for open order conditions | //+------------------------------------------------------------------+ void CheckForOpen() { double ma; int res; //---- go trading only for first tiks of new bar if(Volume[0]>1) return; //---- get Moving Average ma=iMA(NULL,0,MovingPeriod,MovingShift,MODE_SMA,PRICE_CLOSE,0); //---- sell conditions if(Open[1]>ma && Close[1]ma) { res=OrderSend(Symbol(),OP_BUY,LotsOptimized(),Ask,3,0,0,"",MAGICMA,0,Blue); return; } } //+------------------------------------------------------------------+ //| Check for close order conditions | //+------------------------------------------------------------------+ void CheckForClose() { double ma1; //---- go trading only for first tiks of new bar if(Volume[0]>1) return; //---- get Moving Average ma1=iMA(NULL,0,MovingPeriod1,MovingShift1,MODE_SMA,PRICE_CLOSE,0); //---- for(int i=0;ima1 && Close[1]ma && Close[1]ma1)OrderClose(OrderTicket(),OrderLots(),Ask,3,White); //Open[1]ma break; } } } void CheckForOrderModify() { string Symb=Symbol(); // Финанс. инструмент //--------------------------------------------------------------- 2 -- for(int i=1; i<=OrdersTotal(); i++) // Цикл перебора ордер { if (OrderSelect(i-1,SELECT_BY_POS)==true) // Если есть следующий { // Анализ ордеров: int Tip=OrderType(); // Тип ордера if(OrderSymbol()!=Symb||Tip>1)continue;// Не наш ордер double SL=OrderStopLoss(); // SL выбранного орд. //------------------------------------------------------ 3 -- while(true) // Цикл модификации { double TS=Tral_Stop; // Исходное значение int Min_Dist=MarketInfo(Symb,MODE_STOPLEVEL);//Миним. дист if (TS < Min_Dist) // Если меньше допуст. TS=Min_Dist; // Новое значение TS //--------------------------------------------------- 4 -- bool Modify=false; // Не назначен к модифи switch(Tip) // По типу ордера { case 0 : // Ордер Buy if (NormalizeDouble(SL,Digits)< // Если ниже желаем. NormalizeDouble(Bid-TS*Point,Digits)) { SL=Bid-TS*Point; // то модифицируем его string Text="Buy "; // Текст для Buy Modify=true; // Назначен к модифи. } break; // Выход из switch case 1 : // Ордер Sell if (NormalizeDouble(SL,Digits)> // Если выше желаем. NormalizeDouble(Ask+TS*Point,Digits) || NormalizeDouble(SL,Digits)==0)//или равно нулю { SL=Ask+TS*Point; // то модифицируем его Text="Sell "; // Текст для Sell Modify=true; // Назначен к модифи. } } // Конец switch if (Modify==false) // Если его не модифи break; // Выход из while //--------------------------------------------------- 5 -- double TP =OrderTakeProfit(); // TP выбранного орд. double Price =OrderOpenPrice(); // Цена выбранн. орд. int Ticket=OrderTicket(); // Номер выбранн. орд. Alert ("Модификация ",Text,Ticket,". Ждём ответ.."); bool Ans=OrderModify(Ticket,Price,SL,TP,0);//Модифи его! //--------------------------------------------------- 6 -- if (Ans==true) // Получилось :) { Alert ("Ордер ",Text,Ticket," модифицирован:)"); break; // Из цикла модифи. } //--------------------------------------------------- 7 -- int Error=GetLastError(); // Не получилось :( switch(Error) // Преодолимые ошибки { case 130:Alert("Неправильные стопы. Пробуем ещё раз."); RefreshRates(); // Обновим данные continue; // На след. итерацию case 136:Alert("Нет цен. Ждём новый тик.."); while(RefreshRates()==false) // До нового тика Sleep(1); // Задержка в цикле continue; // На след. итерацию case 146:Alert("Подсистема торгов занята.Пробуем ещё"); Sleep(500); // Простое решение RefreshRates(); // Обновим данные continue; // На след. итерацию // Критические ошибки case 2 : Alert("Общая ошибка."); break; // Выход из switch case 5 : Alert("Старая версия клиентского терминала."); break; // Выход из switch case 64: Alert("Счет заблокирован."); break; // Выход из switch case 133:Alert("Торговля запрещена"); break; // Выход из switch default: Alert("Возникла ошибка ",Error);//Др. ошибки } break; // Из цикла модифи. } // Конец цикла модифи. //------------------------------------------------------ 8 -- } // Конец анализа орд. } // Конец перебора орд. //--------------------------------------------------------------- 9 -- return; // Выход из start() } //+------------------------------------------------------------------+ //| Start function | //+------------------------------------------------------------------+ void start() { //---- check for history and trading if(Bars<100 || IsTradeAllowed()==false) return; //---- calculate open orders by current symbol if(CalculateCurrentOrders(Symbol())==0) CheckForOpen(); CheckForClose(); CheckForOrderModify(); //---- } //+------------------------------------------------------------------+