どんな新人の質問でも、フォーラムを乱雑にしないように。プロフェッショナルは、通り過ぎないでください。Nowhere without you - 6. - ページ 637

 
RostZ:

みなさん、こんにちは。

このエラーについて助けてください。"Not enough rights" or "Not enough rights" code #7

現象:EURCHFX M1ペアのExpert Advisorがポジションを開くことができず、このエラーが表示される(ジャーナルで発見)。問題なく手で開けることができます。別の証券会社では、それが有効です。何が問題なのでしょうか?

よろしくお願いします。

EAの内部で何が書かれているのかが分からないと、何が問題なのかは分かりません。EURCHFX M5とEURCHF M1でのEAの動作はどうなっていますか?
 
Top2n:


この関数は、番号そのものではなく、デッドラインの位置番号を返します。

ポジション番号を取得したとします。では、そのポジションを削除するにはどうすればよいのでしょうか?

ヘルプへのリンクを貼りましたが、その6行下にStringSubstrの ヘルプがあり、これは単に指定した位置から始まる文字列から部分文字列 を抽出するものです。
 
AlexeyVik:
ヘルプへのリンクを紹介しましたが、その6行下にStringSubstrの ヘルプがあり、これは単に指定した位置から始まる文字列から部分文字列 を抽出するだけです。


sc=ObjectsTotal(OBJ_LABEL);
for(int i=0;i<sc;i++) 
 {
 Neme=ObjectName(i);
 
 if(Neme="lTrend_Power") //Если имя объекта OBJ_LABEL то самое,
{
  NemeText="Trend Power: "; // часть описания из строки текст
  for(int il=0;il<=99;il++) // перебираем 1-99
  {
NemeTextPol = StringFind(NemeText+il+"%",il,0); //Полное имя строки текст "Trend Power: 99%". (99% меняется от 1 до 99)

Kon = StringSubstr(NemeText+il+"%",13,3);
  }
}
私は何を間違えているのだろう?タスクは、文字列から99(桁)を抽出することである。
 
Top2n:

私は何を間違えているのだろう?タスクは、文字列から99(桁)を抽出することである

sc=ObjectsTotal(OBJ_LABEL);

これはラベルオブジェクトの数ですが、他のオブジェクトが存在する場合は、オブジェクトループでエラーになります。

次に、同じ名前のラベルが他にない場合は、すべてのオブジェクトを調べる必要はありません。OBJPROP_TEXTを抜き出して作業 すればいいのです。


文字列 NameText = ObjectGetString(0, "lTrend_Power",OBJPROP_TEXT);

文字列 Kon = StringSubstr(NameText, 13, 2);

という文字列形式で、数値を含む文字列を必要な型に変換します。

さて、この例から判断すると、あなたはプログラミングの全体像を理解するにはあまりにも遠いようです。

NemeText="Trend Power: "; // часть описания из строки текст

オブジェクトの説明の 一部ではなく、この変数NemeTextには "Trend Power: "という値が代入されています。

ヘルプを全部読んで、解決策を見たことを思い出してください...。をクリックすると、必要なものをすべてドキュメントで簡単に見つけることができます。

 
paladin80:
EAの内部で何が書かれているのかが分からないと、何が問題なのかは分かりません。EURCHFX M5とEURCHF M1でのEAの動作はどうなっていますか?

EURCHFX M1以外ではどこでも使えます。Insufficient right "の意味がよくわからず、どのような場合にこのメッセージが表示されるのか、詳しい説明をどこにも見つけることができませんでした。"Insufficient right "は何に対する反応なのでしょうか...メタクォーツはその意味を知っているはずです。
 
AlexeyVik:

これはラベルオブジェクトの数ですが、他のオブジェクトが存在する場合は、オブジェクトループでエラーになります。

次に、同じ名前のラベルが他にない場合は、すべてのオブジェクトを調べる必要はありません。OBJPROP_TEXTを抜き出して作業 すればいいんです。


文字列 NameText = ObjectGetString(0, "lTrend_Power",OBJPROP_TEXT);

文字列 Kon = StringSubstr(NameText, 13, 2);

で、文字列形式の数値を含む文字列を目的の型に変換します。

実際、あなたはこの例から判断して、プログラミングの全工程を理解するには程遠いようです。

オブジェクトの説明の一部ではなく、この変数NemeTextには "Trend Power: "という値が代入されています。

ヘルプを全部読んで、解決策を見たことを思い出してください...。をクリックすると、ドキュメントから必要なものを簡単に見つけることができます。


ありがとうございます!そうですね、今週末は読書でもしようかな、アーケイムに行くので)))
 

教えていただきたいのですが、INDICATOR_COLOR_INDEXで 1つのインジケータバッファを異なる色で着色することを試された方はいらっしゃいますか?それともMT4ではまだ動作しないのでしょうか?

例 >>>のように

MT5では、このコードは次のように動作します。

//+------------------------------------------------------------------+
//|                                                        #Test.mq5 |
//|                        Copyright 2010, MetaQuotes Software Corp. |
//|                                              https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2010, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property indicator_separate_window
#property indicator_buffers 2
#property indicator_plots   1
#property indicator_color1  clrRoyalBlue,clrRed
//--- Индикаторные буферы
double indicator_buffer[];
double color_indicator_buffer[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- Установка буферов
   SetIndexBuffer(0,indicator_buffer,INDICATOR_DATA);
   SetIndexBuffer(1,color_indicator_buffer,INDICATOR_COLOR_INDEX);
//--- Свойства
   PlotIndexSetInteger(0,PLOT_LINE_WIDTH,5);
   PlotIndexSetInteger(0,PLOT_ARROW,159);
   PlotIndexSetInteger(0,PLOT_DRAW_TYPE,DRAW_COLOR_ARROW);
   PlotIndexSetDouble(0,PLOT_EMPTY_VALUE,0);
//--- Инициализация буфера
   ArrayInitialize(indicator_buffer,0);
//---
   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=0;
//--- Если первый вызов
   if(prev_calculated==0)
     {
      limit=0;
      ArrayInitialize(indicator_buffer,0);
     }
   else
      limit=prev_calculated-1;
//--- Основной цикл
   for(int i=limit; i<rates_total && !IsStopped(); i++)
     {
      indicator_buffer[i]=rand()%3;
      color_indicator_buffer[i]=(indicator_buffer[i]==1) ? 0 : 1;
     }
//---
   return(rates_total);
  }
//+------------------------------------------------------------------+

//---

MT4でも同様のコードですが、MQL4用に若干の修正を加えてこのような結果になっています。

//+------------------------------------------------------------------+
//|                                                        #Test.mq4 |
//|                        Copyright 2014, MetaQuotes Software Corp. |
//|                                              https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2014, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property strict
#property indicator_separate_window
#property indicator_buffers 2
#property indicator_color1  clrRoyalBlue,clrRed
//--- Индикаторные буферы
double indicator_buffer[];
double color_indicator_buffer[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- Установка буферов
   SetIndexBuffer(0,indicator_buffer,INDICATOR_DATA);
   SetIndexBuffer(1,color_indicator_buffer,INDICATOR_COLOR_INDEX);
//--- Свойства
   SetIndexStyle(0,DRAW_ARROW,EMPTY,5);
   SetIndexArrow(0,159);
   SetIndexEmptyValue(0,0);
//--- Инициализация буфера
   ArrayInitialize(indicator_buffer,0);
//---
   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=0;
//--- Если первый вызов
   if(prev_calculated==0)
     {
      limit=0;
      ArrayInitialize(indicator_buffer,0);
     }
   else
      limit=prev_calculated-1;
//--- Основной цикл
   for(int i=limit; i<rates_total && !IsStopped(); i++)
     {
      indicator_buffer[i]=rand()%3;
      color_indicator_buffer[i]=(indicator_buffer[i]==1) ? 0 : 1;
     }
//---
   return(rates_total);
  }
//+------------------------------------------------------------------+
 

はい、くだらない質問が多いのは理解しています。正直なところ、一日中試しているのですが、結果が出ません。

現在のバー上の複数のトレンド ラインの価格値を配列に書き込んでいます。

オブジェクトが存在しない場合、配列から値を削除するにはどうすればよいですか?

 
Top2n:

はい、くだらない質問が多いのは理解しています。正直なところ、一日中試しているのですが、結果が出ません。

現在のバー上の複数のトレンドラインの価格値を配列に書き込んでいます。

オブジェクトが存在しない場合、配列から値を削除するにはどうすればよいですか?

もし、毎ティックごとにトレンドラインの価格の値を調べ、配列を初期化し、次に必要なトレンド ラインの価格を見つけるときにその次元を大きくすれば、削除したトレンドラインの値を配列から削除する必要はなくなります。この配列は動的なもので、tick毎に毎回、既存のオブジェクトの値のみを含むことになる。
 
Top2n:

オブジェクトが存在しない場合、配列から値を削除するにはどうすればよいですか?


価格をゼロに指定することで