Всем добрый день. На днях начал изучать mql4, таким образом опыта нет вообще, хотя сам программист, но работал с другими языками.
В общем по теме...
Подключил я индикатор MA - double MA = iMA(Symbol(),PERIOD_M5,3,0,MODE_SMA,PRICE_CLOSE,0); // Индикатор MA со строго заданным 5 минутным таймфреймом
А как проверить, пересекает ли индикатор свечу сверху вниз, или наоборот?
Последний параметр 0 это текущая свеча. Если проставить 1 будет предыдущая свеча. Соответственно если цена на предыдущей свече была выше МА а на текущей ниже...
Чего-то я тут не то впарил...
Можно взять открытие свечи, выше.ниже МА и текущее положение цены...
В общем есть варианты... Основное, это положение цены относительно МА чуть раньше и сейчас.
Всем добрый день. На днях начал изучать mql4, таким образом опыта нет вообще, хотя сам программист, но работал с другими языками.
В общем по теме...
Подключил я индикатор MA - double MA = iMA(Symbol(),PERIOD_M5,3,0,MODE_SMA,PRICE_CLOSE,0); // Индикатор MA со строго заданным 5 минутным таймфреймом
А как проверить, пересекает ли индикатор свечу сверху вниз, или наоборот?
cм. код эксперта в стандартной поставке при установке терминала - там как раз входы в рынок на пересечении.
//+------------------------------------------------------------------+ //| Moving Average.mq4 | //| Copyright 2005-2014, MetaQuotes Software Corp. | //| http://www.mql4.com | //+------------------------------------------------------------------+ #property copyright "2005-2014, MetaQuotes Software Corp." #property link "http://www.mql4.com" #property description "Moving Average sample expert advisor" #define MAGICMA 20131111 //--- Inputs input double Lots =0.1; input double MaximumRisk =0.02; input double DecreaseFactor=3; input int MovingPeriod =12; input int MovingShift =6; //+------------------------------------------------------------------+ //| Calculate open positions | //+------------------------------------------------------------------+ int CalculateCurrentOrders(string symbol) { int buys=0,sells=0; //--- for(int i=0;i<OrdersTotal();i++) { if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==false) break; if(OrderSymbol()==Symbol() && OrderMagicNumber()==MAGICMA) { if(OrderType()==OP_BUY) buys++; if(OrderType()==OP_SELL) sells++; } } //--- return orders volume if(buys>0) 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_SELL,LotsOptimized(),Bid,3,0,0,"",MAGICMA,0,Red); return; } //--- buy 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 ma; //--- 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); //--- for(int i=0;i<OrdersTotal();i++) { if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==false) break; if(OrderMagicNumber()!=MAGICMA || OrderSymbol()!=Symbol()) continue; //--- check order type if(OrderType()==OP_BUY) { if(Open[1]>ma && Close[1]<ma) { if(!OrderClose(OrderTicket(),OrderLots(),Bid,3,White)) Print("OrderClose error ",GetLastError()); } break; } if(OrderType()==OP_SELL) { if(Open[1]<ma && Close[1]>ma) { if(!OrderClose(OrderTicket(),OrderLots(),Ask,3,White)) Print("OrderClose error ",GetLastError()); } break; } } //--- } //+------------------------------------------------------------------+ //| OnTick function | //+------------------------------------------------------------------+ void OnTick() { //--- check for history and trading if(Bars<100 || IsTradeAllowed()==false) return; //--- calculate open orders by current symbol if(CalculateCurrentOrders(Symbol())==0) CheckForOpen(); else CheckForClose(); //--- } //+------------------------------------------------------------------+
А вообще фак https://forum.mql4.com/ru/38943 в помощь - там на первое время всё есть.
- www.mql5.com
Всем добрый день. На днях начал изучать mql4, таким образом опыта нет вообще, хотя сам программист, но работал с другими языками.
В общем по теме...
Подключил я индикатор MA - double MA = iMA(Symbol(),PERIOD_M5,3,0,MODE_SMA,PRICE_CLOSE,0); // Индикатор MA со строго заданным 5 минутным таймфреймом
А как проверить, пересекает ли индикатор свечу сверху вниз, или наоборот?
Еще цену надо смотреть, функция iClose(Sumbol(),PERIOD_M5,0);
MA0 = iMA(Symbol(),PERIOD_M5,3,0,MODE_SMA,PRICE_CLOSE,0); MA1 = iMA(Symbol(),PERIOD_M5,3,0,MODE_SMA,PRICE_CLOSE,1); P0 = функции iClose(Symbol(),PERIOD_M5,0); P1 = функции iClose(Symbol(),PERIOD_M5,1); if(P0>M0 && P1<=M1){}//цена пересекла ма вверх if(P0<M0 && P1>=M1){}//цена пересекла ма вниз
А вообще фак https://forum.mql4.com/ru/38943 в помощь - там на первое время всё есть.
Понял, буду читать.
Еще цену надо смотреть, функция iClose(Sumbol(),PERIOD_M5,0);
Большое спасибо!
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
Всем добрый день. На днях начал изучать mql4, таким образом опыта нет вообще, хотя сам программист, но работал с другими языками.
В общем по теме...
Подключил я индикатор MA - double MA = iMA(Symbol(),PERIOD_M5,3,0,MODE_SMA,PRICE_CLOSE,0); // Индикатор MA со строго заданным 5 минутным таймфреймом
А как проверить, пересекает ли индикатор свечу сверху вниз, или наоборот?