[警告は閉鎖されました!】フォーラムを乱雑にしないために、どんな初心者の質問でも。プロフェッショナルは、通り過ぎないでください。あなたなしでは、どこにも行けない。 - ページ 627

 
chief2000:

return(0)」を「return」に置き換えたが、「問題」は解決しなかった。最適化後も同じ0-zeroの結果を見ることができる。最適化時にゼロを出力しない解決策はありますか?

ありがとうございます。


しているかどうかはわかりませんが、念のためお伝えしておきますと、「無駄な結果を無視する」にチェックを入れてください。

バランスによる)マイナスの結果は解消されます。ゼロについてはよくわかりませんが、試してみてください。

 
新しいティックごとに、例えば15±7以内の「乱数」を、与えられた範囲内でランダムに発生させるにはどうしたらいいのだろう.
 

こんな感じ。

int random(){
   MathSrand(TimeLocal());
   while(true){
      int x = MathRand();
      if(x >= 8 && x <= 22)return(x);
   }
}

:)

 
ToLik_SRGV:

こんな感じ。

:)

ありがとうございます!!!;)
 
ToLik_SRGV:

ご存じかどうかわかりませんが、念のため、「無駄な結果をスキップする」にチェックを入れてください。

バランスによる)ネガティブな結果はフィルタリングされます。nullのものはよくわかりませんが、試してみてください。

最適化の初期段階では、NULL結果の中から最適なものを選択することがよくあります(後期では、NULL結果に目を通して比較することが有効です)。ゼロは、まさに結果が意味をなさないし、多すぎて保存ファイルのサイズが大きくなり、結果を見るのに視覚的に支障をきたすので邪魔になる。とにかくありがとうございました。

 
granit77:

外部変数 MA_Fast_Period と MA_Slow_Period のことであれば、解決策があります。 Expert Advisor で変数が計算されている場合は、何もする必要がありません。

もう遅いし、頭も働かないし...でも、とても良いアイデアだと思います!ありがとうございました。

 
artmedia70:
新しいティックごとに、例えば15±7以内の「乱数」を、与えられた範囲内でランダムに発生させるにはどうしたらいいのだろう.
http://prolang.ru/index.php/cpp/cpptheory/3-clang-random.html

区間[a,b]に一様分布する乱数実数を得るには、以下の式を使用する。

x = rand()*(b-a)/RAND_MAX + a;

mqlの場合、MathRand()関数の説明で、0から32767の範囲の擬似乱数整数を返すとある。

例:mqlの場合 RAND_MAX = 32767

 

mq4を学び始めて、すぐに曖昧な場面に遭遇しました。

いわば、手を動かしてみたのです。マに簡単なExpert Advisorを書きました。しかし、それは歴史の上でも取引しようとはしない。エラーは表示されません。

どこで失敗したのか、教えてください。

int start()
  {
   //---проверим возможность входа в позицию
   bool flagchange = false;
   int Slippage = 3;
   int i = 0;
   double lt = getLots() ; // минимальный лот
   RefreshRates();
   int total = OrdersTotal();   
   int ticket = -1;
   for (;;)
      {
      int flag= GetEma();
       if (flagchange != flag) // проверим, сигнал ема изменился? если да, то можно открыть или закрыть поз.
       flagchange = true;      // изменился!
       else flagchange = false;
        if (flagchange == True)
        {       
           int Total=OrdersTotal(); //проверим есть открытые позиции?
           if(Total>0)
  {
     for(i=Total-1; i>=0; i--) 
     {
        if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES)==true) // если а то закрываем
        {
           if(OrderType()==OP_BUY || OrderType()==OP_SELL) // Только Buy и Sell
           {
              if(OrderType()==OP_BUY) 
              bool Result=OrderClose(OrderTicket(),OrderLots(),Bid,Slippage,CLR_NONE);
              else
              Result=OrderClose(OrderTicket(),OrderLots(),Ask,Slippage,CLR_NONE);
              if(Result!=true) 
              { 
              Print("LastError = ",GetLastError()); 
              }
           }
        }
        else // если открытых нет, то окрываем.
         if (flag ==1) OrderSend(Symbol(),OP_BUY,lt,Ask,Slippage,Bid - sl * Point,0,"Buy",888,0,Blue);
         else OrderSend(Symbol(),OP_SELL,lt,Bid,Slippage,Ask + sl * Point,0,"Seel",888,0,Red);
        {
        }
     }
  }                                             
      }
 }      
//----
   return(0);
  }
      //////////////////////////////////////////////////////
  int GetEma() {
  //----Получим значение EMA1
      int ma1= iMA(Symbol(),PERIOD_H1,ema1,0,1,6,0);
  //----Получим значение EMA2   
      int ma2= iMA("",PERIOD_H1,ema2,0,1,6,0); 
      if (ma1>ma2) return (1);
      else return (0);}
   /////////////////////////////////////////////////////  
         // посчитаем разтер лота
   double getLots() 
        {
                double minlot = MarketInfo(Symbol(), MODE_MINLOT);
                 int round = MathAbs(MathLog(minlot) / MathLog(10.0)) + 0.5;
                 double lot = minlot;
//---- select lot size
                 lot = NormalizeDouble(AccountFreeMargin() * Risk / 1000.0, round);
                 if (AccountFreeMargin() < lot * MarketInfo(Symbol(), MODE_MARGINREQUIRED)) 
                        {
                                lot = NormalizeDouble(AccountFreeMargin() / MarketInfo(Symbol(), MODE_MARGINREQUIRED), round);
                        }
                 if(lot < minlot) lot = minlot;
                 double maxlot = MarketInfo(Symbol(), MODE_MAXLOT);
                 if(lot > maxlot) lot = maxlot;
//---- return lot size
   return(lot);
        } 
 


bool flagchange = false;
int Slippage = 3; int i = 0; double lt = getLots() ; // 最小ロット RefreshRates(); int total = OrdersTotal(); int ticket = -1;





for (;;)
{ int flag= GetEma();

if (flagchange != flag)

は、パラメータなしのfor文ですか?- 永遠のループはそのように書かれていませんし、第二に、EA用のグローバル変数があります - ターミナル用ではありません、それらは、あなたが書いたように、すべての関数とstart()関数を含む前にコードの一番最初に記述されています - あなたがstart()関数を呼び出すすべてのティックで、 フラグチェンジ= false; そして、あなたは以前の状態と比較してみて、そのフラグの状態は常に偽であろうとします。

もし、あなたが自分の力を試してみたいなら、Kodobaseの既製のExpert Advisorを使い、市場に参入 する条件を自分のものに変えてみると、より早く参入できるはずです。


 
MarkTrade:

mq4を学び始めて、すぐに曖昧な場面に遭遇しました。

いわば、手を動かしてみたのです。マに簡単なExpert Advisorを書きました。しかし、それは歴史の上でも取引しようとはしない。エラーは表示されません。

どこで失敗したのか、教えてください。


EAをループさせる目的は何ですか?

for (;;) {


}