MQL4、MQL5に関する初心者からの質問、アルゴリズムやコードに関するヘルプ、ディスカッションなど。 - ページ 1599

 
Nerd Trader:
isCrossing() はなぜ2を 返さないのか?isCrossing() 自体には2つ目のif 項目がありますが、そうするとisCrossing() == 2の ときにOnTick()if 項目がありません。なんて、くだらないことを・・・。

両方の条件が合う...だから、最初の結果が得られる

 
MakarFX:

両方の条件が合う...だから、最初の結果が得られる

Bid==maのときのみ適合します。<= を < に修正(>= も同様)しましたが、何も変わりません。
 
Nerd Trader:
isCrossing() はなぜ2を 返さないのか?isCrossing() 自体には2つ目のif 項目がありますが、そうするとisCrossing() == 2の ときにOnTick()if 項目がありません。なんてくだらないことを・・・。

なぜか1も返ってこないような気がします。

この条件

if(g_barTime < iTime(NULL,g_timeFrame,0)// и дальше

新しいバーが開かれたことを知らせる。バーの最初のティックでは、open == high == low == close and == Bid - 従って、この条件は以下の通りです。

 && high > ma && Bid <= ma)

または

 && low < ma && Bid >= ma)
叶わぬ

今日、if(i != i)という条件についての質問がありましたが、これらの条件はほぼ同じです。

 
OnTick()は、私のエディタでは、現在、
void OnTick()
  {
/*     if(isCrossing() == 1){          
      Print("enter to '1. if (isCrossing)'");
        if(shouldBars(1))         
          Print("angulation is ", shouldAngulation(1));            
    } */

    if(isCrossing() == 2){
      Print("enter to '2. if (isCrossing)'");
      if(shouldBars(2))
        Print("angulation is ", shouldAngulation(2));
        //if(shouldAngulation(2))
          //OpenSell();
    }

   
  }
最初のブロックがコメントアウトされると、2番目のブロックが実行されます。どこがエラーなのかわからない。

P.S.
isCrossing() 関数ですべてそのままにしておきました。
 
Alexey Viktorov:

なぜか1も返ってこないような気がします。

この条件

は、新しいバーの開店を伝えています。バーの最初のティックでは、open == high == low == close and == Bid - 従って、この条件では

または

叶わぬ

今日、if(i != i) という条件についての質問がありましたが、これらの条件はほぼ同じです。

「1 "が返ってくるので、MetaEditorでコードデバッグを行いました。

さらに、すべてが均等であっても、それは最初のティックだけである。

 
Nerd Trader:

「1 "が返ってくるので、MetaEditorでコードデバッグを行いました。

さらに、すべてが均等であっても、それは最初のティックだけである。

まあ、そうなんですが、私が間違っていました。新バーは、すべての条件を満たした後となります。

ハイとローをオープンに置き換えてみてください。たぶん、あまり戦略には影響しないでしょう。

 
Nerd Trader:

「1 "が返ってくるので、MetaEditorでコードデバッグを行いました。

さらに、すべてが均等であっても、それは最初のティックだけである。

次のような仕組みになっています。

//--- input parameters
input int                  g_maPeriod  = 14;
input int                  g_maShift   = 1;
input ENUM_APPLIED_PRICE   g_maPrice   = PRICE_CLOSE;  //Applied price
input ENUM_MA_METHOD       g_maMethod  = MODE_SMA;    //Method Ma
input ENUM_TIMEFRAMES      g_timeFrame = PERIOD_CURRENT;   //Timeframe for calculate
datetime g_barTime=0;
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//---
   if(g_barTime != iTime(NULL,g_timeFrame,0))
     {
      if(isCrossing()==1)
        {
         Print("enter to '1. if (isCrossing)'"); g_barTime = iTime(NULL,g_timeFrame,0);
        }
      if(isCrossing()==2)
        {
         Print("enter to '2. if (isCrossing)'"); g_barTime = iTime(NULL,g_timeFrame,0);
        }
     }
  }
//+------------------------------------------------------------------+
int isCrossing()
  {  
   int res=0;
   double low = iLow(Symbol(), g_timeFrame, 1);
   double high = iHigh(Symbol(), g_timeFrame, 1);
   double ma = iMA(_Symbol, g_timeFrame, g_maPeriod, g_maShift, g_maMethod, g_maPrice, 0);

   if(high > ma && Bid <= ma) res=1;
  
   if(low < ma && Bid >= ma) res=2;
   return (res);
  }
//+------------------------------------------------------------------+
2021.08.25 09:24:56.629 2021.08.20 23:50:00  Nerd Trader EURUSD,M5: enter to '1. if (isCrossing)'
2021.08.25 09:24:56.624 2021.08.20 23:45:00  Nerd Trader EURUSD,M5: enter to '2. if (isCrossing)'
2021.08.25 09:24:56.592 2021.08.20 21:35:00  Nerd Trader EURUSD,M5: enter to '2. if (isCrossing)'
2021.08.25 09:24:56.582 2021.08.20 21:05:00  Nerd Trader EURUSD,M5: enter to '1. if (isCrossing)'
2021.08.25 09:24:56.566 2021.08.20 20:20:00  Nerd Trader EURUSD,M5: enter to '1. if (isCrossing)'
2021.08.25 09:24:56.554 2021.08.20 18:50:00  Nerd Trader EURUSD,M5: enter to '2. if (isCrossing)'
2021.08.25 09:24:56.553 2021.08.20 18:45:00  Nerd Trader EURUSD,M5: enter to '2. if (isCrossing)'
2021.08.25 09:24:56.553 2021.08.20 18:40:00  Nerd Trader EURUSD,M5: enter to '1. if (isCrossing)'
 
MakarFX:

仕組みはこうです。


これを実行したところ、すべて動作しましたが、f-iが1ティックで2回呼ばれているため、isCrossing()からのメッセージだけが重複しています。

void OnTick()
  {
   if(BarTime != iTime(NULL,0,0)){

     if(isCrossing == 1){
       ...
     }

     if(isCrossing == 2){
       ...
     }
     BarTime = iTime(NULL,0,0); 
  }

int isCrossing()
  {  
    ...

    if(high > ma && Bid <= ma){
      Print("Crossing down");
      return 1;
    } 
  
    if(low < ma && Bid >= ma){
      Print("Crossing up");
      return 2;
    }
   return 0;
  }


そこで、そのままにしておいたのですが、isCrossing()からはすべて変数に返されるようになりました。重複するものはなく、すべてが機能する。皆さん、ありがとうございます。)

void OnTick()
  {
    int iCrossing = isCrossing();

    if(iCrossing == 1){
       ...
    }

    if(iCrossing == 2){
       ...
    }   
  }
 
MakarFX:
2021.08.25 09:24:56.629 2021.08.20 23:50:00  Nerd Trader EURUSD,M5: enter to '1. if (isCrossing)'
2021.08.25 09:24:56.624 2021.08.20 23:45:00  Nerd Trader EURUSD,M5: enter to '2. if (isCrossing)'
2021.08.25 09:24:56.592 2021.08.20 21:35:00  Nerd Trader EURUSD,M5: enter to '2. if (isCrossing)'
2021.08.25 09:24:56.582 2021.08.20 21:05:00  Nerd Trader EURUSD,M5: enter to '1. if (isCrossing)'
2021.08.25 09:24:56.566 2021.08.20 20:20:00  Nerd Trader EURUSD,M5: enter to '1. if (isCrossing)'
2021.08.25 09:24:56.554 2021.08.20 18:50:00  Nerd Trader EURUSD,M5: enter to '2. if (isCrossing)'
2021.08.25 09:24:56.553 2021.08.20 18:45:00  Nerd Trader EURUSD,M5: enter to '2. if (isCrossing)'
2021.08.25 09:24:56.553 2021.08.20 18:40:00  Nerd Trader EURUSD,M5: enter to '1. if (isCrossing)'
ログが追加されたので見た。こちらもメッセージの重複があります :)
 

機能の違いについて教えてください。

for (int j = OrdersHistoryTotal()-1; j >= 0; j--)

{

if(OrderSelect(j, SELECT_BY_POS,MODE_HISTORY))

и

int i=OrdersHistoryTotal();

for(int pos=0; pos<i; pos++)

{

if(OrderSelect(pos, SELECT_BY_POS,MODE_HISTORY))