Любые вопросы новичков по MQL4 и MQL5, помощь и обсуждение по алгоритмам и кодам - страница 2540

 
Ребят помогите пожалуйтса:
Пишу код при котором будет открываться ордер при условии что 2 индикатора пересекаются, 
пересечение индикаторов работает нормально но вот установка цены для ордера некорректно, вот код:

   double price = iClose(_Symbol,PERIOD_CURRENT,1);
   double takeProfit = price * (1 + TakeProfitPercent / 100);
   double stopLoss = price * (1 - StopLossPercent / 100);



   if(EnableBuy &&
      (myMovingAverageArray1[0] > myMovingAverageArray2[0]) &&
      (myMovingAverageArray1[1] < myMovingAverageArray2[1]))
     {
      Comment("Time - ", iTime(_Symbol,PERIOD_CURRENT,1), " Price - ", iClose(_Symbol,PERIOD_CURRENT,1));
      Alert("BUY Signal");
      if(trade.PositionOpen(_Symbol, ORDER_TYPE_BUY, LotSize, iClose(_Symbol,PERIOD_CURRENT,1), stopLoss, takeProfit))
        {
         tradeOpened = true;
         lastTradeBar = currentBar; 
        }
     }

   if(EnableSell &&
      (myMovingAverageArray1[0] < myMovingAverageArray2[0]) &&
      (myMovingAverageArray1[1] > myMovingAverageArray2[1]))
     {
       Comment("Time - ", iTime(_Symbol,PERIOD_CURRENT,1), " Price - ", iClose(_Symbol,PERIOD_CURRENT,1));
      Alert("SELL Signal");
      if(trade.PositionOpen(_Symbol, ORDER_TYPE_BUY, LotSize, iClose(_Symbol,PERIOD_CURRENT,1), stopLoss, takeProfit))
        {
         tradeOpened = true;
         lastTradeBar = currentBar; // Запоминаем номер бара
        }
     }
  }

самое ироничное Comment выводится корректно, а вот ордер нет, хоть там и там используется
Расчёт интегральных характеристик излучений индикаторов
Расчёт интегральных характеристик излучений индикаторов
  • www.mql5.com
Излучения индикаторов - это малоизученное направление исследования рынка. В первую очередь из-за трудности анализа, которая вызвана обработкой очень больших массивов изменяющихся во времени данных. Существующий графический анализ слишком ресурсоёмкий и поэтому был разработан экономный алгоритм с использованием таймсерий излучений. В статье предлагается заменить визуальный (интуитивно-образный) анализ исследованием интегральных характеристик излучения. Статья будет интересна как трейдерам, так и разработчикам механических торговых систем.
 
Nagmetov #:
Ребят помогите пожалуйтса:
Пишу код при котором будет открываться ордер при условии что 2 индикатора пересекаются, 
пересечение индикаторов работает нормально но вот установка цены для ордера некорректно, вот код:


самое ироничное Comment выводится корректно, а вот ордер нет, хоть там и там используется

Код вставляйте с помощью кнопки


Что касается цены открытия, то при открытия с рынка используйте Ask/Bid

    if(EnableBuy &&
      (myMovingAverageArray1[0] > myMovingAverageArray2[0]) &&
      (myMovingAverageArray1[1] < myMovingAverageArray2[1]))
     {
      Comment("Time - ", iTime(_Symbol,PERIOD_CURRENT,1), " Price - ", iClose(_Symbol,PERIOD_CURRENT,1));
      Alert("BUY Signal");
      if(trade.PositionOpen(_Symbol, ORDER_TYPE_BUY, LotSize, SymbolInfoDouble(_Symbol,SYMBOL_ASK), stopLoss, takeProfit))
        {
         tradeOpened = true;
         lastTradeBar = currentBar; 
        }
     }

   if(EnableSell &&
      (myMovingAverageArray1[0] < myMovingAverageArray2[0]) &&
      (myMovingAverageArray1[1] > myMovingAverageArray2[1]))
     {
       Comment("Time - ", iTime(_Symbol,PERIOD_CURRENT,1), " Price - ", iClose(_Symbol,PERIOD_CURRENT,1));
      Alert("SELL Signal");
      if(trade.PositionOpen(_Symbol, ORDER_TYPE_SELL, LotSize,SymbolInfoDouble(_Symbol,SYMBOL_BID), stopLoss, takeProfit))
        {
         tradeOpened = true;
         lastTradeBar = currentBar; // Запоминаем номер бара
        }
     }
  }
 
Здравствуйте! Подскажите пожалуйста,где можно найти такие значки? Пробовал искать в шрифтах типа:Wingdings и т.д. Все без успешно
Файлы:
 
Tretyakov Rostyslav #:

Нет

1,2,3 или 3,1,2 все равно

Вот две части оригинального кода (рабочих индикаторов)

вот 1 часть:

#property indicator_chart_window
#property indicator_buffers 8
#property indicator_plots   6
#property indicator_color1  clrWhite
#property indicator_type1   DRAW_ARROW
#property indicator_width1  5
#property indicator_color2  clrLime
#property indicator_width2  2
#property indicator_color3  clrBlue //C'0,128,255'
#property indicator_width3  7
#property indicator_type3   DRAW_ARROW
#property indicator_color4  clrRed //C'192,0,192'
#property indicator_width4  7
#property indicator_type4   DRAW_ARROW
#property indicator_color5  clrDodgerBlue //C'0,128,255'
#property indicator_width5  3
#property indicator_type5   DRAW_ARROW
#property indicator_color6  clrMediumVioletRed //C'192,0,192'
#property indicator_width6  3
#property indicator_type6   DRAW_ARROW

int    SR     = 3; // = 3..4   
input int    SRZZ = 60;
input string AlertsSection = ""; // == Alerts ==
input bool     Popup_Alert              = true; // Popup message
input bool     Notification_Alert       = false; // Push notification
input bool     Email_Alert              = false; // Email
input bool     Play_Sound               = false; // Play sound on alert
input string   Sound_File               = ""; // Sound file

// Buffers:
double Lmt[];
double LZZ[];
double SA[];
double SM[];
double Up[];
double Dn[];
double pUp[];
double pDn[];

int OnInit()
{
     SetIndexBuffer(0, Lmt, INDICATOR_DATA);
   PlotIndexSetInteger(0, PLOT_ARROW, 167);
   PlotIndexSetDouble(0, PLOT_EMPTY_VALUE, 0);
   ArraySetAsSeries(Lmt, true);

   SetIndexBuffer(1, LZZ, INDICATOR_DATA);
   if (DrawZZ)
   {
      PlotIndexSetInteger(1, PLOT_DRAW_TYPE, DRAW_SECTION);
      PlotIndexSetDouble(1, PLOT_EMPTY_VALUE, 0);
   }
   else PlotIndexSetInteger(1, PLOT_DRAW_TYPE, DRAW_NONE);
   ArraySetAsSeries(LZZ, true);
   
   SetIndexBuffer(2, Up, INDICATOR_DATA);
   PlotIndexSetInteger(2, PLOT_ARROW, 233); // Green up arrow
   PlotIndexSetDouble(2, PLOT_EMPTY_VALUE, 0);
   ArraySetAsSeries(Up, true);

   SetIndexBuffer(3, Dn, INDICATOR_DATA);
   PlotIndexSetInteger(3, PLOT_ARROW, 234); // Green up arrow
   PlotIndexSetDouble(3, PLOT_EMPTY_VALUE, 0);
   ArraySetAsSeries(Dn, true);
   
   SetIndexBuffer(4, pUp, INDICATOR_DATA);
   PlotIndexSetInteger(4, PLOT_ARROW, 104); // Green up markers
   PlotIndexSetDouble(4, PLOT_EMPTY_VALUE, 0);
   ArraySetAsSeries(pUp, true);

   SetIndexBuffer(5, pDn, INDICATOR_DATA);
   PlotIndexSetInteger(5, PLOT_ARROW, 104); // Red down markers
   PlotIndexSetDouble(5, PLOT_EMPTY_VALUE, 0);
   ArraySetAsSeries(pDn, true);

   SetIndexBuffer(6, SA, INDICATOR_CALCULATIONS);
   ArraySetAsSeries(SA, true);
   SetIndexBuffer(7, SM, INDICATOR_CALCULATIONS);
   ArraySetAsSeries(SM, true);
   
   if (SR < 2) SR = 2;
   if (SRZZ <= SR)
   {
      Alert("SRZZ should be greater than SR (", SR, ")");
      return(INIT_FAILED);
   }

вот 2 часть:

#property copyright " "
#property link      "ru"
#property version   "1.00"
#property indicator_chart_window
#property indicator_buffers 4
#property indicator_plots   1
//--- plot ZigZag 1
#property indicator_label1  "ZigZag"
#property indicator_type1   DRAW_SECTION
#property indicator_color1  clrRed
#property indicator_style1  STYLE_SOLID
#property indicator_width1  3

//--- input parameters
input int      period=34;
//--- indicator buffers ZigZag 1
double ZigBuffer[], trend[],HighBar[],LowBar[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- indicator buffers mapping
   SetIndexBuffer(0,ZigBuffer,INDICATOR_DATA);

   SetIndexBuffer(1,trend,INDICATOR_CALCULATIONS);
   SetIndexBuffer(2,HighBar,INDICATOR_CALCULATIONS);
   SetIndexBuffer(3,LowBar,INDICATOR_CALCULATIONS);
   //--- set short name and digits
   IndicatorSetInteger(INDICATOR_DIGITS,_Digits);
//--- set an empty Value

//---
   return(INIT_SUCCEEDED);
  }

Вот, что получилось. Правильно?

#property indicator_chart_window
#property indicator_buffers 12
#property indicator_plots   7 
#property indicator_color2  clrWhite
#property indicator_type2   DRAW_ARROW
#property indicator_width3  5
#property indicator_color3  clrLime
#property indicator_width3  2
#property indicator_color4  clrBlue //C'0,128,255'
#property indicator_width4  7
#property indicator_type4   DRAW_ARROW
#property indicator_color5  clrRed //C'192,0,192'
#property indicator_width5  7
#property indicator_type5   DRAW_ARROW
#property indicator_color6  clrDodgerBlue //C'0,128,255'
#property indicator_width6  3
#property indicator_type6   DRAW_ARROW
#property indicator_color7  clrMediumVioletRed //C'192,0,192'
#property indicator_width7  3
#property indicator_type7   DRAW_ARROW
//--- plot ZigZag 
#property indicator_label1  "ZigZag"
#property indicator_type1   DRAW_SECTION
#property indicator_color1  clrRed
#property indicator_style1  STYLE_SOLID
#property indicator_width1  3
sinput string  EA_Params = "-- Параметры ZigZag --"; 
//--- input parameters ZigZag
input int      period=34;
sinput string  EA_Params = "-- Параметры Signals"; 
input int    SRZZ = 60;
input string AlertsSection = ""; // == Alerts ==
input bool     Popup_Alert              = true; // Popup message
input bool     Notification_Alert       = false; // Push notification
input bool     Play_Sound               = false; // Play sound on alert
input string   Sound_File               = ""; // Sound file
// Buffers Signals:
double Lmt[];
double LZZ[];
double SA[];
double SM[];
double Up[];
double Dn[];
double pUp[];
double pDn[];
//--- indicator buffers ZigZag
double ZigBuffer[], trend[],HighBar[],LowBar[];
//----------------------------------------------------------------
void zz()
{
//--- indicator buffers mapping
   SetIndexBuffer(1,ZigBuffer,INDICATOR_DATA);

   SetIndexBuffer(9,trend,INDICATOR_CALCULATIONS);
   SetIndexBuffer(10,HighBar,INDICATOR_CALCULATIONS);
   SetIndexBuffer(11,LowBar,INDICATOR_CALCULATIONS);
   //--- set short name and digits
   IndicatorSetInteger(INDICATOR_DIGITS,_Digits);
//--- set an empty Value
  }
//----------------------------------------------------------------   
int OnInit()
   SetIndexBuffer(0, Lmt, INDICATOR_DATA);
   PlotIndexSetInteger(0, PLOT_ARROW, 167);
   PlotIndexSetDouble(0, PLOT_EMPTY_VALUE, 0);
   ArraySetAsSeries(Lmt, true);

   SetIndexBuffer(2, LZZ, INDICATOR_DATA);
   if (DrawZZ)
   {
      PlotIndexSetInteger(2, PLOT_DRAW_TYPE, DRAW_SECTION);
      PlotIndexSetDouble(2, PLOT_EMPTY_VALUE, 0);
   }
   else PlotIndexSetInteger(2, PLOT_DRAW_TYPE, DRAW_NONE);
   ArraySetAsSeries(LZZ, true);
   
   SetIndexBuffer(3, Up, INDICATOR_DATA);
   PlotIndexSetInteger(3, PLOT_ARROW, 233); // Green up arrow
   PlotIndexSetDouble(3, PLOT_EMPTY_VALUE, 0);
   ArraySetAsSeries(Up, true);

   SetIndexBuffer(4, Dn, INDICATOR_DATA);
   PlotIndexSetInteger(4, PLOT_ARROW, 234); // Green up arrow
   PlotIndexSetDouble(4, PLOT_EMPTY_VALUE, 0);
   ArraySetAsSeries(Dn, true);
   
   SetIndexBuffer(5, pUp, INDICATOR_DATA);
   PlotIndexSetInteger(5, PLOT_ARROW, 104); // Green up markers
   PlotIndexSetDouble(5, PLOT_EMPTY_VALUE, 0);
   ArraySetAsSeries(pUp, true);

   SetIndexBuffer(6, pDn, INDICATOR_DATA);
   PlotIndexSetInteger(6, PLOT_ARROW, 104); // Red down markers
   PlotIndexSetDouble(6, PLOT_EMPTY_VALUE, 0);
   ArraySetAsSeries(pDn, true);

   SetIndexBuffer(7, SA, INDICATOR_CALCULATIONS);
   ArraySetAsSeries(SA, true);
   SetIndexBuffer(8, SM, INDICATOR_CALCULATIONS);
   ArraySetAsSeries(SM, true);
   
   if (SR < 2) SR = 2;
   if (SRZZ <= SR)
   {
      Alert("SRZZ should be greater than SR (", SR, ")");
      return(INIT_FAILED);
   }
 
Игорь #:

Вот две части оригинального кода (рабочих индикаторов)

Вот, что получилось. Правильно?

Нет. Все прописывай те в OnInit()

 
W1nd ReD #:
Здравствуйте! Подскажите пожалуйста,где можно найти такие значки? Пробовал искать в шрифтах типа:Wingdings и т.д. Все без успешно
Это другие шрифты из интернета.В терминале их не будет 
 
Tretyakov Rostyslav #:

Код вставляйте с помощью кнопки


Что касается цены открытия, то при открытия с рынка используйте Ask/Bid

Насчёт замечания кода, благодарю, но в итоге ордер по цене отличающейся от цены закрытия предыдущей свечи, например,

если предыдущая свеча закрылась на 1.64452 а ордер открылся 1.64469, а мне нужно чтобы он открылся на 1.64452 

#include <Trade/Trade.mqh>

CTrade trade;
input double LotSize = 0.1; // Fixed lot size
input double TakeProfitPercent = 0.04; // Take Profit
input double StopLossPercent = 0.35;  // Stop Loss
input bool EnableBuy = true;  // Флаг включения покупок
input bool EnableSell = false; // Флаг включения продаж
input bool SingleTradeMode = true; // Флаг режима одной сделки
input int MinBarsBetweenTrades = 40; // Минимальное количество свечей между сделками

bool tradeOpened = false; // Флаг, указывающий, что сделка была совершена
int lastTradeBar = 0; // Последний бар, на котором была закрыта сделка

//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void OnTick()
  {
   if(SingleTradeMode && tradeOpened)
      return; // Если включен режим одной сделки, не торгуем после первой сделки

// Проверка, есть ли уже открытая позиция
   if(PositionSelect(_Symbol))
     {
      tradeOpened = false;
      return;
     }

// Получаем текущий бар
   int currentBar = iBars(_Symbol, _Period);

// Проверяем, прошло ли достаточно баров с последней сделки
   if(currentBar - lastTradeBar < MinBarsBetweenTrades)
      return;

// Создание массивов для скользящих средних
   double myMovingAverageArray1[], myMovingAverageArray2[];

// Определение скользящих средних (SMA 21 и SMA 200)
   int movingAverage1 = iMA(_Symbol, _Period, 21, 0, MODE_SMA, PRICE_CLOSE);
   int movingAverage2 = iMA(_Symbol, _Period, 200, 0, MODE_SMA, PRICE_CLOSE);

// Установка массивов в режим серии
   ArraySetAsSeries(myMovingAverageArray1, true);
   ArraySetAsSeries(myMovingAverageArray2, true);

// Получение значений скользящих средних
   CopyBuffer(movingAverage1, 0, 1, 3, myMovingAverageArray1);
   CopyBuffer(movingAverage2, 0, 1, 3, myMovingAverageArray2);
   
   double price = iClose(_Symbol,PERIOD_CURRENT,1);
   double takeProfit = price * (1 + TakeProfitPercent / 100);
   double stopLoss = price * (1 - StopLossPercent / 100);

// Проверка условий для покупки
   if(EnableBuy &&
      (myMovingAverageArray1[0] > myMovingAverageArray2[0]) &&
      (myMovingAverageArray1[1] < myMovingAverageArray2[1]))
     {
      Comment("Time - ", iTime(_Symbol,PERIOD_CURRENT,1), " Price - ", iClose(_Symbol,PERIOD_CURRENT,1));
      Alert("BUY Signal");
      if(trade.PositionOpen(_Symbol, ORDER_TYPE_BUY, LotSize, iClose(_Symbol,PERIOD_CURRENT,1), stopLoss, takeProfit))
        {
         tradeOpened = true;
         lastTradeBar = currentBar; // Запоминаем номер бара
        }
     }

// Проверка условий для продажи
   if(EnableSell &&
      (myMovingAverageArray1[0] < myMovingAverageArray2[0]) &&
      (myMovingAverageArray1[1] > myMovingAverageArray2[1]))
     {
       Comment("Time - ", iTime(_Symbol,PERIOD_CURRENT,1), " Price - ", iClose(_Symbol,PERIOD_CURRENT,1));
      Alert("SELL Signal");
      if(trade.PositionOpen(_Symbol, ORDER_TYPE_BUY, LotSize, iClose(_Symbol,PERIOD_CURRENT,1), stopLoss, takeProfit))
        {
         tradeOpened = true;
         lastTradeBar = currentBar; // Запоминаем номер бара
        }
     }
  }
//+------------------------------------------------------------------+
 
Nagmetov #:

Насчёт замечания кода, благодарю, но в итоге ордер по цене отличающейся от цены закрытия предыдущей свечи, например,

если предыдущая свеча закрылась на 1.64452 а ордер открылся 1.64469, а мне нужно чтобы он открылся на 1.64452 

Свечи строятся по цене Bid, а позиция Buy открывается по цене Ask вот и вся разница…

 
Alexey Viktorov #:

Свечи строятся по цене Bid, а позиция Buy открывается по цене Ask вот и вся разница…

То есть избежать данной разницы никак нельзя?

 
Nagmetov #:

То есть избежать данной разницы никак нельзя?

можно покупать Bid :-) или продавать Ask

но не везде...просто ставить BUY_LIMIT в bid

как любая лимитка - не факт что сработает, котир может и развернуться.

И хитро-брокером может быть установлен stop-level или freeze-level (это к слову, про брокеров "с узким спредом и быстрым исполнением" )