初心者の方からの質問 MQL5 MT5 MetaTrader 5 - ページ 829

 
mt5で、リアルティクでテストする場合、手数料はそこでカウントされるのでしょうか、それともスプレッドだけなのでしょうか?
 

ループ内のマルチカレンシーエキスパートは、シンボルごとにデータを要求する。そんな断片があるのです。

      int gtc1 = GetTickCount();
      res_copy_buf = CopyBuffer(handle, 0, 0, bars_calc, Buf_01); 
      int gtc2 = GetTickCount();

すべてのシンボルが正常に通過する。最初のパスでは、インジケータ・バッファが充填されるため、約120msの時間がかかります。2回目のパスから、現在のバーの計算時間が1ms未満になります。

特殊なのは、ある有名なブローカーがEURRURのシンボルを持っていることですが、これにはデータが ありません(「更新を待つ」)。そのため、この行で51秒間、計算が止まってしまうのです。エラー 4806 です。51秒は、1サイクルどころか、1回(初回)でも許せない。

質問です。あるキャラクターのデータがないことをすぐに知るにはどうしたらよいですか?そ して、それを記憶し、その後の繰り返しでは、その上にステップを踏むだけで、ペースを崩さずに進むことができるのです。

 

同僚、double型の 配列を文字列に変換する方法をアドバイスしてください。ファイルに書き込む必要があります。ここでは、一般的なトレーニングコードを紹介します。

void OnStart()
{

double ar[];               // Массив
ArrayResize(ar,2);         // Подготовка массива
int i, Size=ArraySize(ar); // стартовое количество элементов

ar[0]=1;                   // Установка значений 2-х элементов массива
ar[1]=2; 

ArrayResize(ar,3); // Увеличение размера массива
ar[2]=3;           // Установка значения новому элементу массива
ArrayResize(ar,4); // Увеличение размера массива
ar[3]=4;           // Установка значения новому элементу массива
ArrayResize(ar,5); // Увеличение размера массива
ar[4]=5;           // Установка значения новому элементу массива
ArrayResize(ar,6); // Увеличение размера массива
ar[5]=6;           // Установка значения новому элементу массив
ArrayResize(ar,7); // Увеличение размера массива
ar[6]=7;           // Установка значения новому элементу массив
Size=ArraySize(ar);// новое количество элементов
ArraySetAsSeries(ar,true); // Смена направления индексации


//--- запись в файл


SaveArrayToFile ("s_ar", ar);
return;
}


bool SaveArrayToFile(string FileName, string  &Array[])
  {
//--- Открытие файла
   int h=FileOpen(FileName,FILE_WRITE|FILE_ANSI|FILE_TXT);
   if(h==-1){Alert(" ошибка открытия файла в ф-ии "); return(false);} // Ошибка открытия файла
   
//--- Запись в файл
   FileWriteInteger(h,ArraySize(Array),INT_VALUE); // Запись размера массива
   FileWriteArray(h,Array); // Запись массива
//--- Закрытие файла
   FileClose(h);
   return(true); // Сохранение выполнено
 

記事より 抜粋

ファイルからの配列の保存と読み込み

配列をファイルから保存したり読み込んだりする場合,配列の1次元目のサイズとその要素数の合計の差を考慮する必要があります.配列を保存するときは、まず配列のサイズ(ArraySize()で決まる要素の総数)をファイルに書き込んでから、配列全体を書き込むようにしましょう。

bool SaveArrayToFile(string FileName,string &Array[])
  {
//--- Открытие файла
   int h=FileOpen(FileName,FILE_TXT|FILE_WRITE);
   if(h==-1) return(false); // Ошибка открытия файла
//--- Запись в файл
   FileWriteInteger(h,ArraySize(Array),INT_VALUE); // Запись размера массива
   FileWriteArray(h,Array); // Запись массива
//--- Закрытие файла
   FileClose(h);
   return(true); // Сохранение выполнено
  }
 

こんにちは、私は以下の問題に直面しています。

同じ商品のEAを2つ持っていて、それぞれ異なるマジックを使っています。私はCTradeを通じてマジックをセットし、ポジションもCTradeを通じてオープンしています。1つ目のEAのオープンポジションを 持つと、そのマジクが2つ目のEAに割り当てられるので(ポジションを開いた後に確認しました、下記参照)、オープンポジションのチェックでは私のマジクが見えず、一方的に多くのポジションを開いてしまいます。アカウントはデモで、これはテスターで検出することはできません。マジックの値がクラスに保存されているのであれば、ゼロにすべきなのかもしれませんが、方法がわかりません。

int OnInit()
  {    
  // выставляем магик  
  m_trade.SetExpertMagicNumber(Magic);
   return(INIT_SUCCEEDED);
}
открываю позицию соответственно тоже через CTrade:
 if(SellCount()>0 || BuyCount()>0)
           {
            Print("Уже есть позиция на продажу !!!");
            return; // не добавлять к открытой позиции на покупку
           }
         SL=NormalizeDouble(latest_price.bid + STP*_Point,_Digits);
         TP=NormalizeDouble(latest_price.bid - TKP*_Point,_Digits);
         
         m_trade.Sell(lots1,_Symbol,0,SL,TP,"LaquerreOSC_MA_2.5.6.7 + 2");
         m_position.Select(_Symbol);
           {
            ulong myMagic=m_position.Magic();
            Print(" Открыта поза Селл с магиком № ",myMagic,", И спредом ",SymbolInfoInteger(_Symbol,SYMBOL_SPREAD));
           }
//+------------------------------------------------------------------+
int SellCount()//проверка рыночных ордеров на продажу
  {
   int count=0;
   for(int i=PositionsTotal()-1; i>=0;i--)
     {
      if(PositionSelect(_Symbol)==true)
        {
         if(PositionGetInteger(POSITION_MAGIC)==Magic && PositionGetInteger(POSITION_TYPE)==POSITION_TYPE_SELL)
            count++;
        }
     }
   return(count);
  }
//+------------------------------------------------------------------+

 
Pavel Nikiforov:

こんにちは、私は以下の問題に直面しています。

同じ商品のEAを2つ持っていて、それぞれ異なるマジックを使っています。私はCTradeを通じてマジックをセットし、ポジションもCTradeを通じてオープンしています。1つ目のEAのオープンポジションが ある場合、そのマジックを2つ目のEAに割り当てているため(ポジションを開いた後に確認しました、下記参照)、オープンポジションのチェックでは私のマジックを見ず、同じ方向に多くのポジションを開いてしまいます。アカウントはデモで、これはテスターで検出することはできません。マジックの値がクラスに保存されているのであれば、もしかしたらゼロにする必要があるのかもしれませんが、方法がわかりません。

コードはシート状ではなく、正しく貼り付けてください


コードについては、各EAの入力パラメータを独自のマジックで設定します。例えば、1つ目を10001、2つ目を10002に設定したとします。

 
Vladimir Karputov:

コードはシート状ではなく、正しく挿入してください


コードについては、各EAに入力パラメータをマジックで設定します。仮に1つ目を10001、2つ目を10002に設定したとします。

このような短い回答ありがとうございました。でも、そこは魔法が違うんです。したがって、2番目のロボットは1番目のマジシャンとポジションを開くと判断しました。どのような経緯で、どこに最初のEAのマジックナンバーを保存しているのか分かりませんが、調べたいと思います。

 
Pavel Nikiforov:

迅速な対応ありがとうございました。でも、そこがマジシャンは違うんですよ。そこで、2台目のロボットが1台目のマジックナンバーでオープニングポジションをとっていることがわかりました。どのような経緯で、どこに最初のEAのマジックナンバーを保存しているのか分かりませんが、調べたいと思います。

この場合、マジックを設定するのがベターです。

  // выставляем магик  
  m_trade.SetExpertMagicNumber(Magic);
OnInitの代わりに、ポジション/オーダーのオープニングの 前に。
 
Alexey Viktorov:

この場合、マジックを指定するのがよいでしょう

OnInit ではなく、ポジションを開く たびに。

この場合、「より良い」ではなく、まさに必要なもの、つまり標準的な取引関数のラッパークラスなのです。複数のマジックを収納することはできません。そのため、新しいマジックを使ってポジションを開く前と、開くときに毎回マジックをセットする必要があります。

一般的には以下のような順序になります。

  • ポジションはマジック1でオープンする必要があります。マジック1を設定すると、それ以降のポジションはマジック1になります。
  • マジシャン2でポジションを開く必要があります。マジシャン2を設定すると、次のすべてのポジションにマジシャン2が設定されます。
  • マジック3でポジションを開くことが必要です。マジック3を設定し、次のポジションはすべてマジック3になります。

など...

 
Alexey Viktorov:

この場合、マジックを設定した方が良い。

OnInitではなく、ポジション/注文の各オープンの 前。

元々、こんなものです、しょうがないです。しかし、例では通常OnInitにあるため、移動しています。ずっと前から、テスト中のフクロウは順調に動いているように見えるのに、突然サーバーを開くと、一方向に20のポジションがある、という具合にいじっています。公募のチェックが授業を通していないのは、どうにかならないのか?

 
Pavel Nikiforov:

迅速な対応ありがとうございました。でも、そこがマジシャンは違うんです。そこで、2台目のロボットが1台目のマジックナンバーでオープニングポジションをとっていることがわかりました。どうしてそうなるのか、どこで最初のEAのマジックナンバーを貯めるのか、わからないが、それを見つけたい。

CTradeクラスにはGetExpertMagicNumber メソッドがないため、トレード操作 後にこのコードを出力してください。

Print("Expert name: ",__FILE__,", magic: ",IntegerToString(m_trade.RequestMagic());

こうすることで、両方のEAが異なる魔法を持っているかどうかをチェックすることができます。

理由: