Скачать MetaTrader 5

Вопрос от новичка по MA

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
officeoff
16
officeoff  

Всем добрый день. На днях начал изучать mql4, таким образом опыта нет вообще, хотя сам программист, но работал с другими языками.

В общем по теме...

Подключил я индикатор MA - double MA = iMA(Symbol(),PERIOD_M5,3,0,MODE_SMA,PRICE_CLOSE,0); // Индикатор MA со строго заданным 5 минутным таймфреймом

А как проверить, пересекает ли индикатор свечу сверху вниз, или наоборот? 

Alexey Viktorov
20805
Alexey Viktorov  
officeoff:

Всем добрый день. На днях начал изучать mql4, таким образом опыта нет вообще, хотя сам программист, но работал с другими языками.

В общем по теме...

Подключил я индикатор MA - double MA = iMA(Symbol(),PERIOD_M5,3,0,MODE_SMA,PRICE_CLOSE,0); // Индикатор MA со строго заданным 5 минутным таймфреймом

А как проверить, пересекает ли индикатор свечу сверху вниз, или наоборот? 

Последний параметр 0 это текущая свеча. Если проставить 1 будет предыдущая свеча. Соответственно если цена на предыдущей свече была выше МА а на текущей ниже...

Чего-то я тут не то впарил...


Можно взять открытие свечи, выше.ниже МА и текущее положение цены...

В общем есть варианты... Основное, это положение цены относительно МА чуть раньше и сейчас.

Roman Shiredchenko
1845
Roman Shiredchenko  
officeoff:

Всем добрый день. На днях начал изучать 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();
//---
  }
//+------------------------------------------------------------------+
Roman Shiredchenko
1845
Roman Shiredchenko  

А вообще фак https://forum.mql4.com/ru/38943 в помощь - там на первое время всё есть.

Навигатор по форуму и ответы на часто задаваемые вопросы. Настоятельно Рекомендуется к Прочтению! (faq) - MQL4 форум
Навигатор по форуму и ответы на часто задаваемые вопросы. Настоятельно Рекомендуется к Прочтению! (faq) - MQL4 форум
  • www.mql5.com
Навигатор по форуму и ответы на часто задаваемые вопросы. Настоятельно Рекомендуется к Прочтению! (faq) - MQL4 форум
Dmitry Fedoseev
47911
Dmitry Fedoseev  
officeoff:

Всем добрый день. На днях начал изучать 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){}//цена пересекла ма вниз 
officeoff
16
officeoff  
Roman Shiredchenko:

А вообще фак https://forum.mql4.com/ru/38943 в помощь - там на первое время всё есть.


Понял, буду читать.

officeoff
16
officeoff  
Dmitry Fedoseev:

Еще цену надо смотреть, функция iClose(Sumbol(),PERIOD_M5,0);

Большое спасибо!

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий