初心者の方からの質問 MQL4 MT4 MetaTrader 4 - ページ 114

 
Rewerpool:
こんにちは!私はどのようにトリガーを作成することができますか? 例えば、私はこの条件が必要です if(iClose(NULL,HTF,4)<BlueLine) if it is executed DayDown = 1 !Q: DayDownを1のままにして、翌日までポーリングしないようにするにはどうしたらよいですか?
int ДеньОпроса=0;
void OnTick()
{
  if(ДеньОпроса != Day())  // Если новый день - нужно опросить
  {
     if(iClose(NULL,HTF,4)<BlueLine) DayDown = 1;  // Опрос
     ДеньОпроса = Day();   // Запомнить день
  }
 
ありがとうございました。ねじ込んでみる)
 
こんにちは、チャートから1つのオブジェクトを削除すると、残りのオブジェクト(あなたの選択)も削除されるという条件でコードを書いてください。

1つのオブジェクトに他のオブジェクトをくっつけていて、このオブジェクトを削除すると、残りはチャートにぶら下がるだけです
 
STARIJ:

こんな感じで持っています。

if(DayNext!= Day()) // 新しい日の場合、ポーリングする必要があります。

{

// ポーリング

if(iClose(NULL,1440,2)<BlueLine))

if(iOpen(NULL,1440,1)<BlueLine && iClose(NULL,HTF,1)>BlueLine)

PROBOI1 = 1;Print("Closed above BlueLine = ",iClose(NULL,HTF,1)).Print("ブルーラインより上で終了");

if(iClose(NULL,1440,2)>RedLine)とする。

if(iOpen(NULL,1440,1)>RedLine && iClose(NULL,HTF,1)<RedLine))

PROBOI1 = -1;Print("Closed below RedLine = ",iClose(NULL,HTF,1));

DayNext = Day(); // 日を記憶する

}

何か問題があれば修正する!さらに、低いTFで今何が起こっているかを追跡したい場合、サーベイの外に「日」を書く必要があるのでしょうか?右 -STARIJ

if(iClose(NULL,60,1)>RedLine&&iClose(NULL,1440,2)>RedLine) ) Sell = 1

 
こんなことしてすみませんが、返信お願いします。
https://www.mql5.com/ru/forum/226620#comment_6481536
 
Vladimir Karputov:

条件1でマジックナンバー+1、条件2でマジックナンバー+2というように設定します。そうすれば、このポジションが条件1で開かれたのか、条件2で開かれたのかを確認することができます...。

午後私はBAYの1ポジションしか成功したことがないんです。販売用のマジコンセットがなぜか動かない。もちろん、マジックそのものを除けば、すべてがまったく同じです。私は何か悪いことをしたのだろうか?

int total=OrdersTotal();

      for(int i=OrdersTotal()-1;i>=0;i--)

      {

        if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))

         {

         if(TimeCurrent()>OrderOpenTime()+100 && OrderTicket() && OrderType()==OP_BUY && (MathAbs(WPR1)<5))

         rez =  OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(MarketInfo(OrderSymbol(),MODE_BID),int(MarketInfo(OrderSymbol(),MODE_DIGITS))),slippage,Yellow); 

        

         if(TimeCurrent()>OrderOpenTime()+100 && OrderTicket() && OrderType()==OP_BUY && OrderMagicNumber==111 && MathAbs(WPR1)<20)

         rez =  OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(MarketInfo(OrderSymbol(),MODE_BID),int(MarketInfo(OrderSymbol(),MODE_DIGITS))),slippage,Yellow);

      

         if(TimeCurrent()>OrderOpenTime()+100 && OrderTicket() && OrderType()==OP_SELL && OrderMagicNumber==222 && MathAbs(WPR1)>97.55)

         rez =  OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(MarketInfo(OrderSymbol(),MODE_ASK),int(MarketInfo(OrderSymbol(),MODE_DIGITS))),slippage,Yellow); 

           

         if(TimeCurrent()>OrderOpenTime()+100 && OrderTicket() && OrderType()==OP_SELL && MathAbs(WPR1)>96)

         rez =  OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(MarketInfo(OrderSymbol(),MODE_ASK),int(MarketInfo(OrderSymbol(),MODE_DIGITS))),slippage,Yellow);               

         }

       continue;  

      }  
 
novichok2018:

私は何か悪いことをしたのだろうか?

私は通信の開始を見つけることができなかったことをお詫びしますが、私はすぐにそれらの中に複雑な条件や計算を避けるためにあなたに助言したいと思います - これはコードが読めなくなり、したがって、論理的なエラーの検索を複雑にする、私は次のようにあなたのコードを記述します。

int total=OrdersTotal();

  for(int i=OrdersTotal()-1;i>=0;i--)

      {

        if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))

         {

            if(TimeCurrent()>OrderOpenTime()+100)&& OrderTicket())

            {   

         if(OrderType()==OP_BUY && (MathAbs(WPR1)<5))

            rez =  OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(MarketInfo(OrderSymbol(),MODE_BID),int(MarketInfo(OrderSymbol(),MODE_DIGITS))),slippage,Yellow); 

         if(OrderType()==OP_BUY && OrderMagicNumber==111 && MathAbs(WPR1)<20)

            rez =  OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(MarketInfo(OrderSymbol(),MODE_BID),int(MarketInfo(OrderSymbol(),MODE_DIGITS))),slippage,Yellow);

         if(OrderType()==OP_SELL && OrderMagicNumber==222 && MathAbs(WPR1)>97.55)

            rez =  OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(MarketInfo(OrderSymbol(),MODE_ASK),int(MarketInfo(OrderSymbol(),MODE_DIGITS))),slippage,Yellow); 

         if(OrderType()==OP_SELL && MathAbs(WPR1)>96)

            rez =  OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(MarketInfo(OrderSymbol(),MODE_ASK),int(MarketInfo(OrderSymbol(),MODE_DIGITS))),slippage,Yellow);

            }

         }

       continue;  

      }

もし、私の言っていることが理解できるのであれば、私があげたコードをもう少し修正して、別の条件if(OrderType()==OP_BUY...) に入れるということです。

そうすれば、ロジカルエラーを見つけるのがより簡単になります。

 
Igor Makanu:

私は通信の開始を見つけることができないことをお詫びしますが、私はすぐにそれらの中に複雑な条件や計算を避けるために助言したいと思います - これはコードが読めなくなり、結果として論理的なエラーの検索を複雑にする、私は次のようにあなたのコードを記述します。

もし、私の言っていることが理解できるのであれば、私があげたコードをもう少し修正することができます。つまり、別の条件if(OrderType()==OP_BUY....

そうすれば、ロジカルエラーを見つけるのがより簡単になります。

しかし、私が理解する限り、プラットフォームによるコードの理解には違いはありません。一方、私にとっては、1つの条件をいくつかの短い条件に分割すると、お互いの中の文の出現回数が増えるため、エラー検索 がより複雑になるようです。でも、もしかしたら、あなたの言うとおり、すぐにあなたの味方になるかもしれません。コードロジックについて - 私のとあなたのとで違いは見つからず、まだエラーは出ていません。

 
novichok2018:

コードロジックについて - 私のとあなたのものに違いはなく、まだエラーは見当たりません。

まさにその通りで、コードのロジックは同じですが、条件を分割すれば、どこに論理的な間違いがあるのか、あなたの場合はそれを取り除けば、より早く見つけることができるのです。

if(TimeCurrent()>OrderOpenTime()+100)&& OrderTicket())

を別の条件に置き換えることで、コードが最適化 されます。この例では、条件は4回チェックされますが、1回で済みます。

を使用してExpert Advisorのジャーナルで出力を確認します。

Print()

どのコードがどのようなパラメータで実行されたかをロギングします。

 

みんな。

Expert AdvisorのコードでMorning Flatインジケータを 読み取るには?

この方法で試しているのですが、うまくいきません。

min=iCustom(Symbol(),0,"Morning Flat",StartHour,EndHour,TargetLevel,1,0);

インジケーターそのもの

//+------------------------------------------------------------------+
//| MorningFlat.mq4 |
//| Scriptong |
//| |
//+------------------------------------------------------------------+
#property copyright "Scriptong"
#property link ""

#property indicator_chart_window
#property indicator_buffers 4
#property indicator_color1 Turquoise
#property indicator_color2 Red
#property indicator_color3 Gold
#property indicator_color4 Silver

extern int StartHour=0;
extern int EndHour=8;
extern double TargetLevel=161.8;
extern color UpColor = Turquoise;
extern color DnColor = Red;
extern color TargetUpColor = Gold;
extern color TargetDnColor = Silver;

//---- buffers
double Up[];
double Down[];
double TargetUp[];
double TargetDn[];
bool Activate=False;
datetime LastDay;
//+------------------------------------------------------------------+
//| Custom indicator initialization function |
//+------------------------------------------------------------------+
int init()
  {
//---- indicators
   if(Period()>PERIOD_H1)
     {
      Comment("Индикатор работает на таймфреймах меньше H4!");
      return(0);
     }
   if(StartHour<0 || EndHour<0 || StartHour>23 || EndHour>23 || StartHour>=EndHour)
     {
      Comment("Значения StartHour и EndHour должны лежать в диапазоне от 0 до 24 и StartHour < EndHour.");
      return(0);
     }

   SetIndexStyle(0,DRAW_LINE);
   SetIndexBuffer(0,Up);
   SetIndexStyle(1,DRAW_LINE);
   SetIndexBuffer(1,Down);
   SetIndexStyle(2,DRAW_LINE);
   SetIndexBuffer(2,TargetUp);
   SetIndexStyle(3,DRAW_LINE);
   SetIndexBuffer(3,TargetDn);
   SetIndexEmptyValue(0, 0.0);
   SetIndexEmptyValue(1, 0.0);
   SetIndexEmptyValue(2, 0.0);
   SetIndexEmptyValue(3, 0.0);

   Activate=True;
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator deinitialization function |
//+------------------------------------------------------------------+
int deinit()
  {
//----
// Удаление объектов-ценовых меток
   for(int i=ObjectsTotal()-1; i>=0; i--)
     {
      string Name=ObjectName(i);
      if(StringSubstr(Name,0,3)=="Lab")
         ObjectDelete(Name);
     }
   Comment("");
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| Ценовая метка со значением уровня |
//+------------------------------------------------------------------+
void DrawLabel(datetime TimeL,double Price,bool Upper,color Col,int Code)
  {
   if(Upper)
      string Name="Lab"+DoubleToStr(TimeL,0)+"U";
   else
      Name="Lab"+DoubleToStr(TimeL,0)+"D";

   if(ObjectCreate(Name,OBJ_ARROW,0,TimeL,Price))
     {
      ObjectSet(Name,OBJPROP_ARROWCODE,Code);
      ObjectSet(Name,OBJPROP_COLOR,Col);
     }
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function |
//+------------------------------------------------------------------+
int start()
  {
//----
   if(!Activate) return(0);

   LastDay=0;
   int counted_bars=IndicatorCounted();
   if(counted_bars>0) counted_bars--;
   int limit=Bars-counted_bars;
   for(int i=limit; i>=0; i--)
      if(TimeHour(Time[i])>=EndHour)
        {
         datetime BeginDay=iTime(Symbol(),PERIOD_D1,iBarShift(Symbol(),PERIOD_D1,Time[i])); // Расчет времени начала суток
         datetime NextDay=BeginDay+86400; // Расчет времени начала следующих суток
         if(LastDay>= BeginDay) continue; // Если в этот день уже рисовали уровни, то продолжаем основной цикл
         int StartBar=iBarShift(Symbol(),0,BeginDay+StartHour*3600); // Бар, соответсвующий началу суток плюс смещение в часах
         int FinishBar=iBarShift(Symbol(),0,BeginDay+(EndHour-1)*3600); // Бар, соответствующий последнему бару "утреннего флэта"
         double LowV=Low[iLowest(Symbol(),0,MODE_LOW,StartBar-FinishBar+1,FinishBar)]; // Нижняя граница
         double HighV=High[iHighest(Symbol(),0,MODE_HIGH,StartBar-FinishBar+1,FinishBar)]; // Верхняя граница
         double TargetU = (HighV-LowV)*(TargetLevel-100)/100+HighV;
         double TargetD = LowV-(HighV-LowV)*(TargetLevel-100)/100;
         // Канал "утреннего флэта"
         for(int j=StartBar; j>=FinishBar; j--)
           {
            Up[j]=HighV;
            Down[j]=LowV;
            //Есть такой индикатор
            // -----------------------
            // Ожидаемые цели при пробое флэта 
            for(j=FinishBar; Time[j]<NextDay && j>=0; j--)
              {
               TargetUp[j] = TargetU;
               TargetDn[j] = TargetD;
              }
            // ------------------- 

            DrawLabel(Time[iBarShift(Symbol(), 0, BeginDay)], HighV, True, UpColor, 5); // Рисуем верхнюю ценовую метку канала
            DrawLabel(Time[iBarShift(Symbol(), 0, BeginDay)], LowV, False, DnColor, 5); // Рисуем нижнюю ценовую метку канала
            DrawLabel(Time[FinishBar],TargetU,True,TargetUpColor,5); // Рисуем верхнюю ценовую метку цели
            DrawLabel(Time[FinishBar],TargetD,False,TargetDnColor,5); // Рисуем нижнюю ценовую метку цели
            LastDay=BeginDay; // Отмечаем, что в этот день уровни уже были нарисованы
           }
        }
   WindowRedraw();
//----
   return(0);
  }
//+------------------------------------------------------------------+