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

 

おはようございます!

建設的な批判を考慮して、チェック関数のコードを変更しました:

bool Check_Trading()
  {
//--- проверка разрешения автоматической торговли на терминале
   if(!AccountInfoInteger(ACCOUNT_TRADE_ALLOWED))
     {
      Print("Ошибка разрешения автоматической торговли на терминале! ",GetLastError());
      return(false);
     }
//--- проверка разрешения автоматической торговли на стороне сервера
   if(!AccountInfoInteger(ACCOUNT_TRADE_EXPERT))
     {
      Print("Ошибка разрешения автоматической торговли на стороне сервера! ",GetLastError());
      return(false);
     }
//--- проверка синхронизированности данных по текущему символу между терминалом и сервером
   if(!SymbolIsSynchronized(_Symbol))
     {
      Print("Ошибка синхронизированности данных по текущему символу! ",GetLastError());
      return(false);
     }
//--- проверка достаточности средств для торговли
   if(!CheckMoneyForTrade(_Symbol,GetLot(),ORDER_TYPE_SELL))
     {
      Print("Ошибка проверки достаточности средств для торговли! ",GetLastError());
      return(false);
     }
//--- проверки корректности объёма сделки
   string descript;
   if(!CheckVolumeValue(GetLot(),descript))
     {
      Print("Ошибка проверки корректности объёма сделки! ",GetLastError());
      return(false);
     }
//--- проверка прошла успешно
   return(true);
  }

CheckMoneyForTrade()関数とCheckVolumeValue()関数は、自由に利用でき、ここから 引用しているため、掲載していません。

一昨日発生したExpert Advisorの問題を 防ぐには、この最低限で十分でしょうか?

よろしくお願いします。

 
MrBrooklin #:

皆さん、おはようございます!

建設的なご批判を考慮して、チェック機能のコードを変更しました:

CheckMoneyForTrade()関数とCheckVolumeValue()関数は、自由に利用できるため 掲載しません。

これで、一昨日のExpert Advisorの不具合は 防げるでしょうか?

よろしくお願いします。

はい、正常なようですが、出来高と十分性を1つの関数でチェックし、十分性のロジックを変更した方が良いでしょう。証拠金のロットが大きいか小さいかをチェックしますが、減らさないようにし、要求されたロットが小さい場合は、私も利用可能な証拠金との関係でロットを計算し、どのようなロットを設定できるか、最小ロットと比較し、小さい場合は、その取引は間違いなく終了します。

 

皆さんこんにちは!私はストキャスティクス RSIというインジケーターを持って います。問題は、それが非常にゆっくりと動作することです。私が理解する限り、主な "ブレーキ "は、配列内の最小値と最大値を検索するために使用される大きな期間のためにこのセクションを作成します:

   lRsi = Buffer_Step1_RSI[i];   
   lLowestRsi = Buffer_Step1_RSI[ArrayMinimum(Buffer_Step1_RSI,i,StochLength)];
   lHighestRsi = Buffer_Step1_RSI[ArrayMaximum(Buffer_Step1_RSI,i,StochLength)];
   Buffer_Step2_Calculate[i] = ( (lRsi-lLowestRsi) / (lHighestRsi-lLowestRsi) ) * 100;   

理想的な解決策は、インジケータが最初の実行中にヒストリーのすべてのバーを通過し、次の実行中に最後のバーだけを更新することです。しかし、その方法がわかりません。可能なのでしょうか?もし可能であれば、リンクやアドバイスをいただけるとありがたいです。

ここにインジケータのコード全体があります:

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[])
{ // OnCalculate

ArraySetAsSeries(time,true);

if( t != time[0]) { // контроль бара
t = time[0];

ArrayInitialize(Buffer_Step1_RSI,0);
CopyBuffer(RSI_Handle,0,0,rates_total,Buffer_Step1_RSI);

double lRsi, lLowestRsi, lHighestRsi;
int ZZZ = rates_total - MathMax(MathMax(RsiLength,StochLength),MathMax(SmoothK,SmoothD)) - 1; 

for (int i = ZZZ; i >= 0; i-- ) { // Цикл расчета индикатора      
                  
   // ====== Calulate Stochastic of RSI ======   
   lRsi = Buffer_Step1_RSI[i];   
   lLowestRsi = Buffer_Step1_RSI[ArrayMinimum(Buffer_Step1_RSI,i,StochLength)];
   lHighestRsi = Buffer_Step1_RSI[ArrayMaximum(Buffer_Step1_RSI,i,StochLength)];
   Buffer_Step2_Calculate[i] = ( (lRsi-lLowestRsi) / (lHighestRsi-lLowestRsi) ) * 100;            
   
   
   // ====== Рассчитываем само значение предварительное (МА1) ======
   // Расчет для всех циклов, кроме первого (МА1)                          
   Step3_MA_Sum = Step3_MA_Sum - Buffer_Step2_Calculate[i + SmoothK + 1] + Buffer_Step2_Calculate[i+1];         
   // Расчет для первого цикла (идет 2-ым номером, т.к. в IF можно обнулить данные) (МА1)
   if (i == ZZZ) {
      Step3_MA_Sum = 0;
      for (int kk = i+1; kk <= i + SmoothK + 1; kk++) Step3_MA_Sum = Step3_MA_Sum + Buffer_Step2_Calculate[kk];
      }      
    Buffer_Step3_MA1[i] = Step3_MA_Sum / SmoothK;

          
   // ====== Расчитываем само значение индикатора (МА2) ======        
   // Расчет для всех циклов, кроме первого (МА2)
   Step4_MA_Sum = Step4_MA_Sum - Buffer_Step3_MA1[i + SmoothD+1] + Buffer_Step3_MA1[i+1];   
   // Расчет для первого цикла (идет 2-ым номером, т.к. в IF можно обнулить данные) (МА2)   
   if (i == ZZZ) {
      Step4_MA_Sum = 0;
      for (int kk = i+1; kk <= i + SmoothD + 1; kk++) Step4_MA_Sum = Step4_MA_Sum + Buffer_Step3_MA1[kk];
      }            
    Buffer_Step4_MA2_IndicatorData[i] = Step4_MA_Sum / SmoothD;
              
   FirstCycle = false;         
   } // Цикл расчета индикатора


} // контроль бара
return(rates_total);

 } // OnCalculate
 
Valeriy Yastremskiy #:

それでいいと思いますが、出来高チェックと十分性チェックを1つの関数にまとめて、十分性のロジックも変えた方がいいと思います。証拠金のロットが多いか少ないかをチェックしますが、減らさないようにし、要求ロットが少ない場合は、使用可能な証拠金との相対的なロット、設定可能なロットを計算し、最小ロットと比較し、少なければ、その取引は間違いなく終了します。

ありがとう、ヴァレリー!

ありがとう、ヴァレリー

 

そして、これがその関数の最初の結果である:

2023.02.02 14:41:05.466 Experts automated trading is disabled because the account has been changed
2023.02.02 14:41:09.990 Experts automated trading is enabled
2023.02.02 14:42:43.410 Experts automated trading is disabled because the account has been changed
2023.02.02 14:42:52.690 Experts automated trading is enabled
2023.02.02 14:43:33.882 Experts automated trading is disabled because the account has been changed
2023.02.02 14:43:44.869 Experts automated trading is enabled

それが何なのか、お知りになりたいですか?ロシア語に翻訳するという意味ではありません:

2023.02.02 14:41:05.466 Автоматическая торговля экспертов отключена, так как аккаунт был изменен

しかし、どのようにアカウントを変更することができるという意味では?私のアカウントに一体何が起こっているのか、またこのような場合どうすればいいのか、どなたか教えていただけませんか?

もしかして、一時的にリアル口座からデモ口座に切り替えたことと関係があるのでしょうか?

よろしく、ウラジミール。

 
tradingviewのようにチャートを縦方向に制限 なく伸ばすことは可能ですか?
 
MrBrooklin #:

一時的にリアル口座からデモ口座に切り替えたことと関係があるのでしょうか?

そうですね。
 
Sergey Gridnev #:
はい

、力強い。

、、、ー

 
Expert Advisorは指定されたTFでインジケータを使用しますが、インジケータのハンドルからTFを調べるにはどうすればよいですか?
 
Aleksey Vyazmikin #:
Expert Advisorは指定されたTFでインジケータを使用しますが、インジケータのハンドルからTFを調べるにはどうすればよいですか?

指定された TF は既知のはずです。状況を詳しく説明してください。

理由: