MQL4、MQL5に関する初心者からの質問、アルゴリズムやコードに関するヘルプ、ディスカッションなど。 - ページ 1536

 
MakarFX:

これを試してみてください、うまくいくはずです。

いいえ、警告音が鳴り続けています。以下は、コード全体と免罪符です。 たぶん、何か間違っているのでしょう。

//+------------------------------------------------------------------+
//|                                                          777.mq4 |
//|                        Copyright 2021, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2021, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property strict
#property indicator_chart_window
#property indicator_buffers 2
#property indicator_plots   2
//--- plot Покупаем
#property indicator_label1  "Продаём"
#property indicator_type1   DRAW_LINE
#property indicator_color1  clrRed
#property indicator_style1  STYLE_SOLID
#property indicator_width1  1
//--- plot Продаём
#property indicator_label2  "Покупаем"
#property indicator_type2   DRAW_LINE
#property indicator_color2  clrBlue
#property indicator_style2  STYLE_SOLID
#property indicator_width2  1
//--- input parameters
double      Buy[];            // Буфер для покупок
double      Sell[];           // Буфер для продаж


int OnInit()
  {
//--- indicator buffers mapping
    SetIndexBuffer(0,Buy);
   SetIndexBuffer(1,Sell);  
   // Устанавливаем нулевые значения для индикатора, при которых не будет сигнальных стрелок
   SetIndexEmptyValue (0, 0);
   SetIndexEmptyValue (1, 0);
   //Определяем стиль отображения индикаторных линий - стрелка
   SetIndexStyle (0, DRAW_ARROW);
   SetIndexStyle (1, DRAW_ARROW); 
   // Установим значки "стрелки" для буферов
   SetIndexArrow(0, 234);  //Стрелка "вниз" для продаж
   SetIndexArrow(1, 233);  //Стрелка "вверх" для покупок
   //Устанавливаем текст описания стрелок индикатора для отображения информации в всплывающей подсказке.
   SetIndexLabel(0, "Продаём");
   SetIndexLabel(1, "Покупаем");
   //Определяем разрядность значений индикаторных линий - приравниваем разрядности фин. инструмента
   IndicatorDigits (Digits);
   //Строка с кратким названием индикатора выводится в сплывающей подсказке при наведении указателя мыши на стрелку
   IndicatorShortName ("Мой первый индикатор");
   
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
  {
//---
 

    int limit=rates_total-prev_calculated-2;
   if(limit<1) return(0);
   for(int i=limit;i>=0;i--)
     {
     
      // Снимем показания индикатора
     double in1b = iCustom(NULL,0,"in1",1,i+1); // индикатор 1 стрелка вверх
     double in1s = iCustom(NULL,0,"in1",0,i+1); // индикатор 1 стрелка вниз
      
     
     
     double in2b = iCustom(NULL,0,"in2",0,i+1); // индикатор 2 стрелка вверх
     double in2s = iCustom(NULL,0,"in2",1,i+1); // индикатор 2 стрелка вниз
    
    Comment("in1v = "+DoubleToString(in1b)+"\n" +"in1n = "+DoubleToString(in1s)+"\n"
    +"in2v = "+DoubleToString(in2b)+"\n" +"in2n = "+DoubleToString(in2s));
     
    if(in1b < 2147483647 && in2b < 2147483647) // индикатор стрелка вверх
        {
         Sell[i]=low[i];
       /*  if(show_alert!=time[i])
           {
            Alert(Symbol()+"BUY М "); show_alert=time[i];
           }*/
        }
   
      if(in1s < 2147483647 && in2s < 2147483647) // индикатор стрелка вниз
        {
         Buy[i]=high[i];
        /* if(show_alert!=time[i])
           {
            Alert(Symbol()+"SELL М "); show_alert=time[i];
           }*/
        }
     }
     
   
     
//--- return value of prev_calculated for next call
   return(rates_total);
  }
//+------------------------------------------------------------------+
ファイル:
in1.ex4  13 kb
in2.ex4  28 kb
 
jarikn:
みんな、インジケーターのアラートを作るのを手伝ってくれ。いろいろなインジケーターを組み合わせてテストしたいのですが、アラート機能が必要です。 矢印が表示されたときに1回だけアラートを表示させたい。あなたがハードでない場合は、私はそれを行うことはできません、アラートが全体の分またはすべての時間をポップアップし、さらにmt4がハングアップし、この関数を記述するために私を助けてください。


変数の追加

シグナルでない場合、この変数はfalseになる

if (signal and variable==false){ { (signal and variable==false)

アラート

variable=true とした。

}

 
Andrey Sokolov:


変数の追加

新しいローソク 足が表示されると、この変数は偽になる

if (signal and variable==false){ { (signal and variable==false)

アラート

variable=true とした。

}

は、1本のキャンドルに1つまでとなります

OK、ありがとうございます。

 
jarikn:

なるほど、ありがとうございます。

そこで変更しました。

 
もう一つ質問ですが、このインジケータはなぜCPUに負荷がかかるのですか? 10通貨ペアを開くと、mt4がすごく重くなるんです。FX取引ロボットとして、mt4のインジケータを使用する必要があります。
 
オブジェクトをプログラムで選択可能にする方法を教えてください。 ヘルプにはそのようなことは書かれていませんでした。
 

皆さんこんにちは。私は、トレンドの角度を度数で表示するインジケータを持っています(正規化されていませんが)。チャート上ではすべてが素晴らしい。角度カーブそのもの(青色)でも、その平均カーブ(緑色)でもよい - 図1Expert Advisor で double Custom = iCustom(Symbol(), window, "Angle", 0, 1) を通じてインジケータを 呼び出すと、プログラムはいくつかの巨大な数字を生成します - 図 2。ダイアログウィンドウ - チャート期間、"Angle" - インジケータ名、0 - 青線が計算されるゼロバッファ(1 - 緑のMAバッファを置くことができますが、結果は似ているでしょう)、1 - シフト です。 何が問題なのでしょうか?

図1

図2

 
Tango_X:
オブジェクトを選択可能にする方法を教えてください。 ヘルプにはそのようなことは書かれていません。

objprop_selected

オブジェクトの選択

mql5

mql4

Документация по MQL5: Константы, перечисления и структуры / Константы объектов / Свойства объектов
Документация по MQL5: Константы, перечисления и структуры / Константы объектов / Свойства объектов
  • www.mql5.com
Свойства объектов - Константы объектов - Константы, перечисления и структуры - Справочник MQL5 - Справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5
 
私はEAを書き、すべてが機能しているように見えます。しかし、スリップの交差点で注文を締めなければならないということです。正確には、最初の注文だけがクローズされ、それがどちらに行ったかは関係なく、ログにエラーOrderClose error 4051が生成されます。何が問題なのか?
   //-----------------------------------------------------------
     if (CountSell() == 0 && mama1<mama2 && cci>verh && cci1>verh && cci<cci1)
      {
      tiket = OrderSend(Symbol(), OP_SELL,Lots,Bid,Slippage,0,0,"",Magic,0, Red);
      if (tiket>0)
         {
         SL=NormalizeDouble(Bid+StopLoss*Point,Digits);
         TP=NormalizeDouble(Bid-TakeProfit*Point,Digits);
         if (OrderSelect(tiket, SELECT_BY_TICKET))
            if (!OrderModify(tiket,OrderOpenPrice(),SL,TP,0))
               Print("Ошибка модификации ордера на продажу");
         } else Print("Ошибка открытия ордера на продажу");
      }
    if (CountBuy() == 0 && mama1>mama2 && cci<nuz && cci1<nuz && cci>cci1)
      {
      tiket = OrderSend(Symbol(), OP_BUY,Lots,Ask,Slippage,0,0,"",Magic,0,Blue);
      if (tiket>0)
         {
         SL=NormalizeDouble(Ask-StopLoss*Point,Digits);
         TP=NormalizeDouble(Ask+TakeProfit*Point,Digits);
         if (OrderSelect(tiket, SELECT_BY_TICKET))
           if (!OrderModify(tiket,OrderOpenPrice(),SL,TP,0))
           Print("Ошибка модификации ордера на покупку");
         } else Print("Ошибка открытия ордера на покупку");
      }  
      
      if(mama1>mama2 && CountSell()>0)
      {
         for(int i = OrdersTotal() -1;i>=0; i--)
         {
         if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
            {
            if(OrderMagicNumber()==Magic && OrderType()==OP_SELL)
            OrderClose(OrderType(),OrderLots(),Ask,Slippage,Black);
            }
         }
         
      }
       if(mama1<mama2 && CountBuy()>0)
      {
         for(int i = OrdersTotal() -1;i>=0; i--)
         {
         if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
            {
            if(OrderMagicNumber()==Magic && OrderType()==OP_BUY)
            OrderClose(OrderType(),OrderLots(),Bid,Slippage,Black);
            }
         }
         
      }
 
Tango_X:
オブジェクトをプログラムで選択可能にする方法を教えてください。 ヘルプにはそのようなことは書かれていませんでした。

標準のオブジェクト作成 機能を使用する場合、デフォルトではselection = trueに設定されています。例えば、トレンドラインであれば、下から4番目のライン。

bool TrendCreate(const long            chart_ID = 0,      // ID графика
                 const string          name = "TrendLine", // имя линии
                 const int             sub_window = 0,    // номер подокна
                 datetime              time1 = 0,         // время первой точки
                 double                price1 = 0,        // цена первой точки
                 datetime              time2 = 0,         // время второй точки
                 double                price2 = 0,        // цена второй точки
                 const color           clr = clrRed,      // цвет линии
                 const ENUM_LINE_STYLE style = STYLE_SOLID, // стиль линии
                 const int             width = 4,         // толщина линии
                 const bool            back = false,      // на заднем плане
                 const bool            selection = true, // выделить для перемещений
                 const bool            ray_right = false, // продолжение линии вправо
                 const bool            hidden = true,     // скрыт в списке объектов
                 const long            z_order = 0)       // приоритет на нажатие мышью