//+------------------------------------------------------------------+ //| Expert_Ichimoku.mq4 | //| Copyright © 2009, MetaQuotes Software Corp. | //| | //+------------------------------------------------------------------+ #property copyright "Copyright © 2009, MetaQuotes Software Corp." #property link "" // Экперт способен работать при открытии позиций в условиях рыночного // исполнения торговых заявок Market Watch , - WHС, BROCO и т.п. // Добавлен встроенный блок ММ (корректно работает только на валютах). // Предусмотрен запрет одноименных сделок на одном баре более одной - // - применена ф-я И.Кима NumberOfBarOpenLastPos(). //---- input parameters extern int Magic=5675; extern int Orders =5; extern int StopLoss=50; extern int TakeProfit=100; extern string ___= "Параметры инд. Ишимоку"; extern int Tenkan=5; extern int Kijun=10; extern int Senkou=20; extern int LipsPeriod=5; extern int LipsShift=3; extern string ____= "Параметры Трейлинг стопа"; extern bool UseTrailing = true;//выключатель трейлинга extern int lMinProfit = 40;//порог трала длинных поз extern int lTrailingStop = 50;//размер трала длинных поз extern int lTrailingStep = 5;// шаг трала extern int sMinProfit = 40;//порог трала коротких поз extern int sTrailingStop = 50;//размер трала коротких поз extern int sTrailingStep = 5; //шаг трала extern string ______= "Параметры блока MoneyManagement"; extern double Lots = 0.01; extern bool MoneyManagement=true; extern int MarginPercent=3; //---------------------------------- double SL,TP; int ticket; double lots; static int prevtime = 0; //-- Подключаемые модули -- #include #include //+------------------------------------------------------------------+ //| expert initialization function | //+------------------------------------------------------------------+ int init() { //---- //---- return(0); } //+------------------------------------------------------------------+ //| expert deinitialization function | //+------------------------------------------------------------------+ int deinit() { //---- //---- return(0); } //+------------------------------------------------------------------+ //| expert start function | //+------------------------------------------------------------------+ int start() { if (Time[0] == prevtime) return(0); // Бар прежний, а следовательно выходим prevtime = Time[0]; // Свежий бар, запоминаем время //---- if (UseTrailing) TrailPositions(); //трейлинг стоп // Объявляем переменные int total, cnt; int err; // double lots; // Вычисляем начальные параметры индикаторов для поиска условий входа double Ten=iIchimoku(NULL, 0,Tenkan, Kijun, Senkou, MODE_TENKANSEN,1); double Kij=iIchimoku(NULL, 0,Tenkan, Kijun, Senkou, MODE_KIJUNSEN,1); double SpanA=iIchimoku(NULL, 0,Tenkan, Kijun, Senkou, MODE_SENKOUSPANA,1); double SpanB=iIchimoku(NULL, 0,Tenkan, Kijun, Senkou, MODE_SENKOUSPANB,1); double Chinkou=iIchimoku(NULL, 0,Tenkan, Kijun, Senkou, MODE_CHINKOUSPAN,1); double Ten1=iIchimoku(NULL, 0,Tenkan, Kijun, Senkou, MODE_TENKANSEN,2); double Kij1=iIchimoku(NULL, 0,Tenkan, Kijun, Senkou, MODE_KIJUNSEN,2); double SpanA1=iIchimoku(NULL, 0,Tenkan, Kijun, Senkou, MODE_SENKOUSPANA,2); double SpanB1=iIchimoku(NULL, 0,Tenkan, Kijun, Senkou, MODE_SENKOUSPANB,2); double Chinkou1=iIchimoku(NULL, 0,Tenkan, Kijun, Senkou, MODE_CHINKOUSPAN,2); double Ten2=iIchimoku(NULL, 0,Tenkan, Kijun, Senkou, MODE_TENKANSEN,3); double Kij2=iIchimoku(NULL, 0,Tenkan, Kijun, Senkou, MODE_KIJUNSEN,3); double SpanA2=iIchimoku(NULL, 0,Tenkan, Kijun, Senkou, MODE_SENKOUSPANA,3); double SpanB2=iIchimoku(NULL, 0,Tenkan, Kijun, Senkou, MODE_SENKOUSPANB,3); double Chinkou2=iIchimoku(NULL, 0,Tenkan, Kijun, Senkou, MODE_CHINKOUSPAN,3); total=OrdersTotal(); Comment( LotsCounting() ); //======================================================================= // Проверка средств if(AccountFreeMargin()<(1000*Lots)) { Print("У вас недостаточно денег. Free Margin = ", AccountFreeMargin()); return(0); } //============Открытие позиций ======================================= if ( NumberOfPositions(NULL , -1, Magic )Kij && Ask>SpanA1 && Ask>SpanB1 && Open[1]Close[10] && Ask>SpanA1 && Ask>SpanB1 && Open[1]0) SL=Ask-Point*StopLoss; if(TakeProfit>0) TP=Ask+Point*TakeProfit; lots=LotsCounting(); ticket=WHCOrderSend(Symbol(),OP_BUY,lots,Ask,3,SL,TP,"Покупаем",Magic,0,Green); if(ticket < 0) { Print("Ошибка открытия ордера BUY #", GetLastError()); Sleep(10000); prevtime = Time[1]; return (0); } } } //================================================================= // Проверка условий для совершения сделки селл if (! NumberOfBarOpenLastPos(NULL, 0,OP_SELL, Magic) ==0) {//запрет неск. поз на одном баре if ((Ten1>=Kij1 && TenClose[1]) || (Chinkou1>=Open[11] && ChinkouClose[1]))//продаем { SL=0;TP=0; if(StopLoss>0) SL=Bid+Point*StopLoss; if(TakeProfit>0) TP=Bid-Point*TakeProfit; lots=LotsCounting(); ticket=WHCOrderSend(Symbol(),OP_SELL,lots,Bid,3,SL,TP,"Продаем",Magic,0,Red); if(ticket < 0){ Print("Ошибка открытия ордера SELL #", GetLastError()); Sleep(10000); prevtime = Time[1]; return (0); } } } //===================================================================== } //если открытых позиций менее Orders //============ конец блока открытия позиций =========================== //================Закрытие позиций===================================== //---------------------------------------------------------------------- for ( int v = OrdersTotal() - 1; v >= 0; v -- ) { if (OrderSelect(v, SELECT_BY_POS, MODE_TRADES)) { if (OrderSymbol()==Symbol() && OrderMagicNumber()==Magic) { //----------------------------------------------------- if (OrderType() == OP_BUY) { if((Ten1>=Kij1 && TenClose[1]) || (Chinkou1>=Open[11] && ChinkouClose[1]) && OrderProfit( ) >=0) { OrderClose(OrderTicket(),OrderLots(),Bid,3,Yellow); // закрываем позицию // return(0); // выходим } } //-------------------------------------------------------- if (OrderType() == OP_SELL) { if((Ten1<=Kij1 && Ten>Kij && Ask>SpanA1 && Ask>SpanB1 && Open[1]Close[10] && Ask>SpanA1 && Ask>SpanB1 && Open[1]=0) { OrderClose(OrderTicket(),OrderLots(),Ask,3,Yellow); // закрываем позицию // return(0); // выходим } } //------------------------------------------------------- } // Symbol() } // select } //total //================== Конец блока закрытия ============================= return(0); } //ЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖ Конец функции int start() ЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖ //+------------------------------------------------------------------+ //+------------------------------------------------------------------+ void TrailPositions() {// функция трейлинг стоп int Orders = OrdersTotal(); for (int i=0; i lMinProfit*Point) { if (OrderStopLoss() < Bid-(lTrailingStop+lTrailingStep-1)*Point) { OrderModify(OrderTicket(), OrderOpenPrice(), Bid-lTrailingStop*Point, OrderTakeProfit(), 0, Blue); }}} if (OrderType() == OP_SELL && OrderMagicNumber()==Magic) { if (OrderOpenPrice()-Ask > sMinProfit*Point) { if (OrderStopLoss() > Ask+(sTrailingStop+sTrailingStep-1)*Point || OrderStopLoss() == 0) { OrderModify(OrderTicket(), OrderOpenPrice(), Ask+sTrailingStop*Point, OrderTakeProfit(), 0, Blue); }}}} } //------------------------------------------------------------------------------+ //======================== Блок ММ ============================================== //ЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖ double LotsCounting() { double lots=Lots; if (MoneyManagement) { double lotsize=MarketInfo(Symbol(),MODE_LOTSIZE); double freemargin=AccountFreeMargin(); lots=0; if (lotsize>0) lots=NormalizeDouble((MarginPercent*freemargin/lotsize),1); Comment(NormalizeDouble((MarginPercent*freemargin/lotsize),1)); } if (lots>5) lots=4.9; if (lots<0.1) lots=0.1;return (lots); } //ЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖ // Функция orders for WHC - //Для открытие позиций в условиях рыночного исполнения торговых заявок Market Watch int WHCOrderSend(string symbol, int cmd, double volume, double price, int slippage, double stoploss, double takeprofit, string comment, int magic, datetime expiration, color arrow_color) { int ticket = OrderSend(symbol,cmd, volume, price, slippage, 0, 0, comment, magic, expiration, arrow_color); int check = -1; if (ticket > 0 && (stoploss != 0 || takeprofit != 0)) { if (!OrderModify(ticket, price, stoploss, takeprofit,expiration, arrow_color)) { check = GetLastError(); if (check != ERR_NO_ERROR) { Print("OrderModify error: ", ErrorDescription(check)); } } } else { check = GetLastError(); if (check != ERR_NO_ERROR){ Print("OrderSend error: ",ErrorDescription(check)); } } return (ticket); } //+----------------------------------------------------------------------------+ //| | //| Описание : Возвращает количество позиций. | //+----------------------------------------------------------------------------+ //| Параметры: | //| sy - наименование инструмента ("" - любой символ, | //| NULL - текущий символ) | //| op - операция (-1 - любая позиция) | //| mn - MagicNumber (-1 - любой магик) | //+----------------------------------------------------------------------------+ int NumberOfPositions(string sy="", int op=-1, int mn=-1) { int i, k=OrdersTotal(), kp=0; if (sy=="0") sy=Symbol(); for (i=0; i