マーケットプレイスの自動チェック - ページ 6

 
Evgeniy Scherbina:
XAUUSDcheckはテストしません。でも、テストが成功するのは、それ以外のものをテストしているから......。
結局、テストは受けたのでしょうか?今朝試したところ、その自動テストは完全に消え、EAは自動テストをバイパスして直接モデレーターにテストされるようになりました。以前のように
 
知っておいて損はない。
Solving Atomatic Validation Problems
Solving Atomatic Validation Problems
  • 2017.01.11
  • Stanislav Korotky
  • www.mql5.com
If you're distributing some products for MetaTrader 4/5 via the Market, you probably know that a special "welcome" stage of automatic product validation has been added recently by MetaQuotes on the...
 
fxsaber:
知っておいて損はない。
「十分待ったのにまだ問題があるようなら、サービスデスクに手紙を書いて、もっと待ってください;-)」と。
 

であり、当然のごとく

OrderSend エラー 131

やだ

自動検査でテスターに異常がないこと

すべての指示に従ったところ、うまくいきました。

OrderSend エラー 131

ウフフフ!!!!
 

オートバリュエーションは、営業マンが最初に経験することだと思うんです。

私も、不注意による失敗をしたことがあります。

しかし、オートバリデーションは、コードベースから無料でコードをダウンロードし、名前を変えて売ろうとする「おたく」たちの前に立ちはだかる最初の壁です。:-(

残念ながら、市場には何千ものプログラムがあり、その中から価値のあるものを2、3個見つけることは困難です。

コードベースに特別なコードを入れて、マーケットが販売に応じないようにするんだ。なぜなら、痛いからです :-( ここでは、顧客を満足させるために何年も、たとえ5年でも、プログラムを開発し、調整し、改善することに費やします。

そして、誰かが完成品をダウンロードして名前を変え、捨て値で市場に 出して、それでおしまい......。 お客さまは「安いということは買う」と思っている。....

中国みたいにね。

私はaliexpressに座って - GOPROのための少なくとも5つのスティックは安く注文 - 結果 - 海で一週間 - スティックは錆びました。

そりゃあ、錆びないオリジナルスティックを100ポンドで買おうと手が上がるわけがない。しかし、いや、中国ではすでに120ポンドを与え、同じ別のスティックを注文している....................。欲の塊だな......。

 
Stefan Stoyanov:

であり、当然のごとく

OrderSend エラー 131

やだ

自動検査でテスターに異常がないこと

推薦されたものはすべてやったのに:

OrderSend エラー 131

ウフフフ!!!!
最小値を確認するだけなので、まったく難しくありません
 
Evgeniy Scherbina:
最小値を確認するだけなので、まったく難しくありません。


これを実現する計算機能がたくさんあるんです。

           double LotsOptimized()
    { int     lotDigit=(int)fabs(log10(SymbolInfoDouble(_Symbol,SYMBOL_VOLUME_STEP)));
            if(!MathIsValidNumber(lotDigit)) lotDigit=0;  
{
double FreeMg =AccountFreeMargin();
double Margin =MarketInfo(Symbol(),MODE_MARGINREQUIRED);
double Step =MarketInfo(Symbol(),MODE_LOTSTEP);
double Minlot =MarketInfo(Symbol(),MODE_MINLOT);
double MaxLot =MarketInfo(Symbol(),MODE_MAXLOT);
double loty =MathFloor(FreeMg*Risk/100/Margin/Step)*Step;
loty = NormalizeDouble(loty,lotDigit);
if(loty<Minlot) loty=Minlot;
if(loty>MaxLot) loty=MaxLot;  
      Lots=loty;
      Lots=NormalizeDouble(Lots,lotDigit);

      return (Lots);}}
  
//================================================================
 

また、市販の例もあります


//+------------------------------------------------------------------+
//|  Проверяет объем ордера на корректность                          |
//+------------------------------------------------------------------+
bool CheckVolumeValue(double volume,string &description)
  {
//--- минимально допустимый объем для торговых операций
   double min_volume=SymbolInfoDouble(Symbol(),SYMBOL_VOLUME_MIN);
   if(volume<min_volume)
     {
      description=StringFormat("Объем меньше минимально допустимого SYMBOL_VOLUME_MIN=%.2f",min_volume);
      return(false);
     }

//--- максимально допустимый объем для торговых операций
   double max_volume=SymbolInfoDouble(Symbol(),SYMBOL_VOLUME_MAX);
   if(volume>max_volume)
     {
      description=StringFormat("Объем больше максимально допустимого SYMBOL_VOLUME_MAX=%.2f",max_volume);
      return(false);
     }

//--- получим минимальную градацию объема
   double volume_step=SymbolInfoDouble(Symbol(),SYMBOL_VOLUME_STEP);

   int ratio=(int)MathRound(volume/volume_step);
   if(MathAbs(ratio*volume_step-volume)>0.0000001)
     {
      description=StringFormat("Объем не является кратным минимальной градации SYMBOL_VOLUME_STEP=%.2f, ближайший корректный объем %.2f",
                               volume_step,ratio*volume_step);
      return(false);
     }
   description="Корректное значение объема";
   return(true);
  }
 

OrderSend を呼び出す前に、OrderSend を介してチェックしています。

if (CheckVolumeValue(Lots,com) ==false )return(0);

いろいろやっても、またエラー131が出ます

 
Stefan Stoyanov:


多くの計算機能でこのようになります。

           double LotsOptimized()
    { int     lotDigit=(int)fabs(log10(SymbolInfoDouble(_Symbol,SYMBOL_VOLUME_STEP)));
            if(!MathIsValidNumber(lotDigit)) lotDigit=0;  
{
double FreeMg =AccountFreeMargin();
double Margin =MarketInfo(Symbol(),MODE_MARGINREQUIRED);
double Step =MarketInfo(Symbol(),MODE_LOTSTEP);
double Minlot =MarketInfo(Symbol(),MODE_MINLOT);
double MaxLot =MarketInfo(Symbol(),MODE_MAXLOT);
double loty =MathFloor(FreeMg*Risk/100/Margin/Step)*Step;
loty = NormalizeDouble(loty,lotDigit);
if(loty<Minlot) loty=Minlot;
if(loty>MaxLot) loty=MaxLot;  
      Lots=loty;
      Lots=NormalizeDouble(Lots,lotDigit);

      return (Lots);}}
  
//================================================================

ロットデジットは常に0を計算する厄介なバカです。ドキュメントの例にはありません。どうやら、たくさんのブラケットを持つことがお好きなようですね?

また、これ。FreeMg*Risk/100/Margin/Step...100はどこから来たのか?明らかに天井から

それは、文字列の多さです。本当に多いですね、何を計算しているのでしょうか?