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

 
neonobblu:
どうか、アドバイスをお願いします。シグナルに接続しているため、そのオープンオーダーをコピーしていますが、取引するロット数を変更することは可能ですか?注文数量を変更するにはどうすればよいですか?

プロバイダのアカウントでは、すべての取引は0.1ロットのボリュームで実行されます。私はこれらの取引がより大きなボリューム、例えば0.3ロットで私にコピーされるようにしたいです。手動で音量を上げることはできますか?

Providerの取引をSubscriberの取引にコピーするルールを作成することはできますか?

 
Roman Shiredchenko:

4の方、通じないみたいなんですけど...。

私は配列を扱う - 私は配列にティックの到着時刻を書き込む必要があります - 例えば、私は入札を書きます。すべてのティックに。私はすべてチケット 通りに行動しており、アルチョム・トリシキンに 感謝している。すべてがうまくいくわけではありません。2日目も戦った。印刷物

ゼロにする。

https://www.mql5.com/ru/forum/145455/page913#1017464

ありがとうございます。

initの変数SIZEが0になっているようですが、では配列のサイズはどうなっているのでしょうか?また、起動時のSIZEは0です。ログの中身は?
 
Artyom Trishkin:
initでは変数SIZEの値が0になっているようですが、では配列のサイズはどのくらいなのでしょうか?また、起動時のSIZEは0です。ログの中身は?
ゼロは・・・考え中です・・・。
 

ゼロもそうだし...。何もわからない...。

//---------------------
extern int MaxDrawTicks=100;
extern int Num_Aver_of_Ticks=5;  
double     xBuffer_Time [1000000]; // Массив значений  
                         // В котором индекс - номер тика, значение - это бид 
int SIZE=0;               // Вспомогательная переменная для массива                                  
int tickCounter, tickCounter_Current; 
//+------------------------------------------------------------------+
int init()
  {   
//--- устанавливаем размер динамического массива
  // if(ArrayResize(xBuffer_Time,SIZE)<0) {Print(" Ошибка в изменении размера массива времени поступления тиков "); return(false);}
//--- установим индексацию для буфера как в таймсерии для динамического массива
  // ArraySetAsSeries(xBuffer_Time,true);    
//---   Возвращает количество элементов указанного массива. 
  // int S=ArraySize(xBuffer_Time);
  // if (S>=0) Print("Размер массива: ",S);
  // else Print("Ошибка. Массив не создан ",S);        
  // ArrayInitialize(xBuffer_Time, 0);
   return(0);
  }  
//+------------------------------------------------------------------+
int start()
  {  
   //ArrayResize(ValueArr,size);
   //ValueArr[size-1] = GetValue();
   //size++; 
 //----------------------------------------  
  // ArrayResize(xBuffer_Time,SIZE);
   xBuffer_Time[SIZE] = Bid; //NormalizeDouble((iTime (_Symbol,1,0)-_start), 2); 
   SIZE ++;
   Print (" Значение xBuffer_Time[SIZE] = ", DoubleToStr(xBuffer_Time[SIZE],Digits) );
   Print (" Значение SIZE = ", DoubleToStr(SIZE,2) );  
 //---------------------------------------      
//------------
   return(0);
  }
 
Roman Shiredchenko:

ゼロもそうだし...。何もわからない...。

SIZEが0にならないように先に増やして、その後に配列の サイズを変更することを示唆しました。
 
Artyom Trishkin:
まあ、SIZEをまず増やして0でなくしてから、配列のサイズを変えるということをほのめかしたわけです。

:-)

ありがとうございます。

必要であれば使ってください。

//---------------------
extern int MaxDrawTicks=100;
extern int Num_Aver_of_Ticks=5;  
double     xBuffer_Time []; // Массив значений   динамический
                            // В котором индекс - номер тика, значение - это бид 
int SIZE=0;                 // Вспомогательная переменная для массива                                  
int tickCounter, tickCounter_Current; 
//+------------------------------------------------------------------+
int init()
  {   
//--- устанавливаем размер динамического массива
   if(ArrayResize(xBuffer_Time,2000000)<0) {Alert(" Ошибка в изменении размера массива времени поступления тиков "); return(false);}
//--- установим индексацию для буфера как в таймсерии для динамического массива
  // ArraySetAsSeries(xBuffer_Time,true);    
//---   Возвращает количество элементов указанного массива. 
   int S=ArraySize(xBuffer_Time);
   if (S>=0) Alert("Размер массива: ",S);
   else Print("Ошибка. Массив не создан ",S);        
   ArrayInitialize(xBuffer_Time, 0);
   return(0);
  }  
//+------------------------------------------------------------------+
int start()
  {  
   //ArrayResize(ValueArr,size);
   //ValueArr[size-1] = GetValue();
   //size++; 
 //----------------------------------------  
   ArrayResize(xBuffer_Time,SIZE);
   xBuffer_Time[SIZE-1] = Bid; //NormalizeDouble((iTime (_Symbol,1,0)-_start), 2); 
  
   if ( SIZE >= 0 && ArraySize(xBuffer_Time) < 2147483647)
      {
      Alert (" Значение xBuffer_Time[SIZE-1] = ", DoubleToStr(xBuffer_Time[SIZE-1],Digits) );
      Alert (" Значение SIZE = ", DoubleToStr(SIZE,2) );  
      } 
    SIZE ++;   
 //---------------------------------------      
//------------
   return(0);
  }
 
Roman Shiredchenko:

:-)

Spc.

必要であれば使ってください。

SIZEはゼロなのに、なぜ配列のサイズを 先に変更してからSIZEを大きくしなければならないのでしょうか?なんということでしょう・・・。

以前、ticks Expert Advisorのために、tickの強弱や範囲を定義する配列埋めをしたことがあります。例として切り出しました。

//+------------------------------------------------------------------+
   MqlTick struct_tick;
//+------------------------------------------------------------------+
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//---
   //--- Запись ID графика
   gv_chart_id_name=Prefix+"_chart_id";                        // имя GV терминала
   long   chart_id=get.GetChartID(symbol);                     // id текущего графика
   double chart_id_double=ToDouble(chart_id);                  // id в представлении double
   if(chart_id>=0) {                                           // chart_id==0 в тестере
      if(!GlobalVariableCheck(gv_chart_id_name))               // Если GV-переменная удалена
         GlobalVariableSet(gv_chart_id_name,chart_id_double);  // создадим опять
      }
   else graph.Message("Чё-та нету chart_id : Symbol()="+symbol+", chart_id="+IntegerToString(chart_id));
   
   //--- работа с тиками текущего графика
   if(SymbolInfoTick(symbol,struct_tick)) {
      double tick_bid=struct_tick.bid;
      datetime tick_time=struct_tick.time;
      WorkOnTick(symbol,tick_bid,tick_time,slowPeriod);
      }
//---
  }
//+------------------------------------------------------------------+

以下の関数は、シンボル変数に格納された目的のシンボルでの作業を整理するもので、もし別のシンボルで作業する必要があれば、そこに記述します。関数 FillArrays()は、単に配列を埋めるだけです。

//+------------------------------------------------------------------+
void WorkOnTick(string sy, double symbol_bid, datetime symbol_time, int limit) {
   long chart_id=get.GetChartID(sy);                       
   int index_symbol=get.PositionsSymbolInList(sy);       // позиция символа в списке
   double pt=SymbolInfoDouble(sy,SYMBOL_POINT);
   double pa=SymbolInfoDouble(sy,SYMBOL_ASK);
   double pb=SymbolInfoDouble(sy,SYMBOL_BID);
   int stoplevel=(int)MarketInfo(sy,MODE_STOPLEVEL);
   int dg=(int)SymbolInfoInteger(sy,SYMBOL_DIGITS);
   //--- заполним массивы
   FillArrays(sy,symbol_bid,symbol_time,table_price,table_time);
   //--- расчёт среднего изменения цен тиков
   double avg_change_price=AverageChangePrice(index_symbol,limit,slowPeriod,table_price);
   //--- вывод информации на график
   wtf(index_symbol,avg_change_price,slowPeriod,table_price,table_time);
   return;   
   
   Trailing(sy, 50, 3, magic);
}
//+------------------------------------------------------------------+

この方法で配列に目盛りを入れる必要がありました。

//+------------------------------------------------------------------+
void FillArrays(string sy, double price, datetime time, double &mass_price[][], datetime &mass_time[][]) {
   //--- сместим данные в массивах влево
   int index_symbol=get.PositionsSymbolInList(sy);       // позиция символа в списке
   for(int i=99; i>0; i--) {                             // сместим данные в массивах влево
      mass_price[index_symbol][i]=mass_price[index_symbol][i-1];
      mass_time[index_symbol][i]=mass_time[index_symbol][i-1];
      }
   //--- запишем товый тик в массивы
   mass_price[index_symbol][0]=price;
   mass_time[index_symbol][0]=time;
}
//+------------------------------------------------------------------+
 
Artyom Trishkin:

SIZEが0なのに、なぜ最初に配列のサイズを変更してからSIZEを大きくするのか、理解に苦しみます。なんということでしょう・・・。

ティックの強弱や広がりを判断するティックアドバイザーのために、ティックで配列埋めをしたことがあります。例として切り出しました。

以下の関数は、シンボル変数に格納された目的のシンボルでの作業を整理するもので、もし別のシンボルで作業する必要があれば、そこに記述します。関数 FillArrays()は、単に配列を埋めるだけです。

この方法で配列に目盛りを入れる必要がありました。

n - tickで1 tick/in 1 secの平均レートが必要です。すなわち、nティックをk秒間に受信し、k/nを1秒間にティックで受信する。この速度は、ティックが 到着するたびに測定する必要があります。それ以降のティックごとに変化します。

 

mt4に時計があるかどうか教えてください。できれば秒針付きがいい。

あるいは、Expert Advisorがあれば、ターミナルの最下行のどこかに時刻が表示されるかもしれません。

理由: