Как начать работу с MQL5 - страница 16

 
mmee55 :
Итак, как только размер бара достигнут, как мы можем заставить его звонить на покупку или продажу?

Например, так:

//+------------------------------------------------------------------+
//|                                  Example Current candle size.mq5 |
//|                              Copyright © 2021, Vladimir Karputov |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2021, Vladimir Karputov"
#property version   "1.002"
//---
#include <Trade\Trade.mqh>
//---
CTrade         m_trade;                      // object of CTrade class
//+------------------------------------------------------------------+
//| Enum Pips Or Points                                              |
//+------------------------------------------------------------------+
enum ENUM_PIPS_OR_POINTS
  {
   pips=0,     // Pips (1.00045-1.00055=1 pips)
   points=1,   // Points (1.00045-1.00055=10 points)
  };
//--- input parameters
input group             "Trading settings"
input ENUM_PIPS_OR_POINTS  InpPipsOrPoints   = pips;           // Pips Or Points:
input uint                 InpCandleSize     = 80;             // Candle: Size
input group             "Additional features"
input ulong    InpDeviation         = 10;          // Deviation
input ulong    InpMagic             = 200;         // Magic number
//---
double   m_candle_size           = 0.0;      // Candle: Size               -> double
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---
   m_trade.SetExpertMagicNumber(InpMagic);
   m_trade.SetMarginMode();
   m_trade.SetTypeFillingBySymbol(Symbol());
   m_trade.SetDeviationInPoints(InpDeviation);
//--- tuning for 3 or 5 digits
   int digits_adjust=1;
   if(Digits()==3 || Digits()==5)
      digits_adjust=10;
   double m_adjusted_point=Point()*digits_adjust;
   if(InpPipsOrPoints==pips) // Pips (1.00045-1.00055=1 pips)
     {
      m_candle_size              = InpCandleSize               * m_adjusted_point;
     }
   else // Points (1.00045-1.00055=10 points)
     {
      m_candle_size              = InpCandleSize               * Point();
     }
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//---
   MqlRates rates[];
   ArraySetAsSeries(rates,true);
   int start_pos=0,count=3;
   if(CopyRates(Symbol(),Period(),start_pos,count,rates)!=count)
      return;
//--- signal search
   if(MathAbs(rates[0].open-rates[0].close)>=m_candle_size)
     {
      if(PositionsTotal()==0)
         m_trade.Buy(0.01);
      int d=0;
     }
  }
//+------------------------------------------------------------------+
Файлы:
 

Как быть, если у вас уже есть функция покупки и продажи... Мне просто нужно, чтобы код обращался к ней... и был больше начальной точки.

if(MathAbs(rates[0].open-rates[0].close)>=m_candle_size > start =buy)

Плохой пример, но может ли это работать как-то похоже на это? Мне нужен конечный результат. 80 пунктов выше стартовой точки равнозначно покупке или ниже равнозначно продаже

 
mmee55 :

Как быть, если у вас уже есть функция покупки и продажи... Мне просто нужно, чтобы код вызывал ее... и был больше начальной точки.

Плохой пример, но может ли это работать как-то похоже на это? Мне нужен конечный результат. 80 пунктов выше начальной точки равнозначно покупке или ниже равнозначно продаже

Я дал вам пример. Дальше все зависит от вашего воображения. Анализируйте " курсы " и пишите любые условия. Анализируя " курсы ", вы можете определить: тип свечи (медвежья или бычья), размер свечи.

 
mmee55:

Как быть, если у вас уже есть функция покупки и продажи... Мне просто нужно, чтобы код вызывал ее... и был больше начальной точки.

Плохой пример, но может ли это работать как-то похоже на это? Мне нужен конечный результат. 80 пунктов выше стартовой точки равнозначно покупке или ниже равнозначно продаже

Версия 1.003:

//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//---
   MqlRates rates[];
   ArraySetAsSeries(rates,true);
   int start_pos=0,count=3;
   if(CopyRates(Symbol(),Period(),start_pos,count,rates)!=count)
      return;
   if(PositionsTotal()>0)
      return;
   if(MathAbs(rates[0].open-rates[0].close)<m_candle_size)
      return;
//--- signal search
   if(rates[0].open<rates[0].close) // bearish
     {
      m_trade.Buy(0.01);
      int d=0;
     }
   else
      if(rates[0].open>rates[0].close) // bullish
        {
         m_trade.Sell(0.01);
         int d=0;
        }
  }
Файлы:
 

Примером использования библиотеки Trend.mqh является класс CiSAR

Код: CiSAR.mq5

//+------------------------------------------------------------------+
//|                                                        CiSAR.mq5 |
//|                         Copyright © 2017-2021, Vladimir Karputov |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2017-2021, Vladimir Karputov"
#property version   "1.001"
#property description "An example of using the Trend.mqh library is the CiSAR class"
#include <Arrays\ArrayObj.mqh>
#include <Indicators\Trend.mqh>
CArrayObj      m_array;                      // CArrayObj object
//--- input parameters
string SymbTrade[]=
  {
   "EURUSD","GBPUSD","USDJPY","USDCHF","NZDUSD","AUDUSD","EURJPY","USDCAD","EURCHF"/*,
   "EURGBP","GBPCHF","GBPJPY","EURAUD","AUDCAD","AUDCHF","AUDJPY","CADCHF","CADJPY",
   "CHFJPY","NZDCAD","NZDCHF","NZDJPY","GBPCAD","GBPAUD","GBPNZD","EURCAD","EURNZD",
   "AUDNZD"*/
  };
//---
string m_timeframe="";
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
   m_timeframe=StringSubstr(EnumToString(Period()),7,-1);
//---
   CiSAR    *isar;
   for(int i=0; i<ArraySize(SymbTrade); i++)
     {
      isar=new CiSAR;
      if(isar==NULL)
        {
         delete isar;
         Print("Object create error");
         return(INIT_FAILED);
        }
      if(isar.Create(SymbTrade[i],Period(),0.02,0.2))
         m_array.Add(isar);
      else
        {
         delete isar;
         Print("SAR ",SymbTrade[i]," create error");
         return(INIT_FAILED);
        }
     }
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//---
   string text="";
   for(int i=0; i<m_array.Total(); i++)
     {
      CiSAR    *isar=m_array.At(i);
      isar.Refresh();
      text+=SymbTrade[i]+","+m_timeframe+" #0 : "+DoubleToString(isar.Main(0),Digits())+"\n";
     }
   Comment(text);
  }
//+------------------------------------------------------------------+


Результат:

CiSAR

Файлы:
CiSAR.mq5  6 kb
 
Спасибо.
 

Пример: как получить значение и цвет индикатора 'iAO' в советнике

Код: iAO Get Value and Color.mq5

При работе на MQL5 запомните главное правило: хэндл индикатора (в данном примере это переменная 'handle_iAO') должен быть создан ТОЛЬКО ОДИН раз, и делать это нужно обязательно в OnInit ().

В приведенном ниже коде показан пример того, как получить хэндл индикатора в советнике и как получить доступ к данным индикатора в советнике. Для примера я дополнительно поместил индикатор на график, чтобы вы могли визуально сравнить показания индикатора и данные, полученные в советнике.

Код:

//+------------------------------------------------------------------+
//|                                      iAO Get Value and Color.mq5 |
//|                              Copyright © 2021, Vladimir Karputov |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2021, Vladimir Karputov"
#property version   "1.001"
#property description "Example: how to get the value and color of the 'iAO' indicator in an advisor"
//--- input parameters
input group                "AO"
input ENUM_TIMEFRAMES      Inp_AO_period        = PERIOD_CURRENT;    // AO: timeframe
input group                "Additional features"
input bool                 InpPrintLog          = false;             // Print log
//---
int      handle_iAO;                            // variable for storing the handle of the iAO indicator
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- create handle of the indicator iAO
   handle_iAO=iAO(Symbol(),Inp_AO_period);
//--- if the handle is not created
   if(handle_iAO==INVALID_HANDLE)
     {
      //--- tell about the failure and output the error code
      PrintFormat("Failed to create handle of the iAO indicator for the symbol %s/%s, error code %d",
                  Symbol(),
                  EnumToString(Inp_AO_period),
                  GetLastError());
      //--- the indicator is stopped early
      return(INIT_FAILED);
     }
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---
   if(handle_iAO!=INVALID_HANDLE)
      IndicatorRelease(handle_iAO);
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//---
   double ao_buffer[],color_buffer[];
   ArraySetAsSeries(ao_buffer,true);
   ArraySetAsSeries(color_buffer,true);
   int start_pos=0,count=2;
   if(!iGetArray(handle_iAO,0,start_pos,count,ao_buffer) || !iGetArray(handle_iAO,1,start_pos,count,color_buffer))
      return;
//---
   string text="";
   int limit=(count>2)?2:count;
   for(int i=0; i<limit; i++)
     {
      text=text+
           " bar #"+IntegerToString(i)+": "+
           " AO "+DoubleToString(ao_buffer[i],Digits()+1)+
           " COLOR "+DoubleToString(color_buffer[i],0)+
           "\n";
     }
   Comment(text);
  }
//+------------------------------------------------------------------+
//| Get value of buffers                                             |
//+------------------------------------------------------------------+
bool iGetArray(const int handle,const int buffer,const int start_pos,
               const int count,double &arr_buffer[])
  {
   bool result=true;
   if(!ArrayIsDynamic(arr_buffer))
     {
      if(InpPrintLog)
         PrintFormat("ERROR! EA: %s, FUNCTION: %s, this a no dynamic array!",__FILE__,__FUNCTION__);
      return(false);
     }
   ArrayFree(arr_buffer);
//--- reset error code
   ResetLastError();
//--- fill a part of the iBands array with values from the indicator buffer
   int copied=CopyBuffer(handle,buffer,start_pos,count,arr_buffer);
   if(copied!=count)
     {
      //--- if the copying fails, tell the error code
      if(InpPrintLog)
         PrintFormat("ERROR! EA: %s, FUNCTION: %s, amount to copy: %d, copied: %d, error code %d",
                     __FILE__,__FUNCTION__,count,copied,GetLastError());
      //--- quit with zero result - it means that the indicator is considered as not calculated
      return(false);
     }
   return(result);
  }
//+------------------------------------------------------------------+


Результат:

iAO Получить ценность и цвет

Рис. 1. iAO Get Value and Color

Как видите, мы не можем получить цвет индикатора в виде "clrRed или clrGreen". Мы можем только получить доступ к цветовому буферу и получить индекс цвета (на рисунке выше это '1' и '0').

Файлы:
 
Я пытался выставить рыночные ордера, используя код из книги " Программирование советников для MetaTrader 5" Эндрю Р. Янга ,и он выдает ошибку неподдерживаемого типа заполнения, пожалуйста, помогите
if(( strategy logic &&
            (SellPlaced == false && positionType != POSITION_TYPE_SELL))
           {
            request.action = TRADE_ACTION_DEAL;
            request.type = ORDER_TYPE_SELL;
            request.symbol = sym;
            request.volume = LotSize() + currentVolume;
            request.type_filling = ORDER_FILLING_FOK;
            request.price = SymbolInfoDouble(sym,SYMBOL_BID);
            request.sl = 0;
            request.tp = 0;
            request.deviation = 50;
            OrderSend(request,result);
            // Modify SL/TP
            if((result.retcode == TRADE_RETCODE_PLACED || result.retcode == TRADE_RETCODE_DONE)
               && (StopLoss > 0 || TakeProfit > 0))
              {
               request.action = TRADE_ACTION_SLTP;
               do
                  Sleep(100);
               while(PositionSelect(sym) == false);
               double positionOpenPrice = PositionGetDouble(POSITION_PRICE_OPEN);
               if(StopLoss > 0)
                  request.sl = positionOpenPrice + (StopLoss * _Point);
               if(TakeProfit > 0)
                  request.tp = positionOpenPrice - (TakeProfit * _Point);
               if(request.sl > 0 && request.tp > 0)
                  OrderSend(request,result);
               BuyPlaced = false;
               SellPlaced = true;
              }
           }

 
Ahmad861 :
Я пытался выставить рыночные ордера, используя код из книги " Программирование советников для MetaTrader 5" Эндрю Р. Янга ,но он выдает ошибку неподдерживаемого типа заполнения, пожалуйста, помогите

Вот самый простой код:

//+------------------------------------------------------------------+
//|                                                    Open Sell.mq5 |
//|                              Copyright © 2018, Vladimir Karputov |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2018, Vladimir Karputov"
#property version   "1.000"
#property script_show_inputs
//---
#include <Trade\Trade.mqh>
CTrade         m_trade;                      // trading object
//--- input parameters
input ulong    InpMagic             = 200;         // Magic number
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
//---
   m_trade.SetExpertMagicNumber(InpMagic);
   m_trade.SetMarginMode();
   m_trade.SetTypeFillingBySymbol(Symbol());
   m_trade.Sell(1.0); // open Sell position, volume 1.0 lot
  }
//+------------------------------------------------------------------+
Файлы:
Open_Sell.mq5  2 kb
 
Vladimir Karputov:

Вот самый простой код:

Приведенный вами код не проверяет, открыт ли уже ордер, не устанавливает стоплосс и тейкпрофит.

Причина обращения: