どんな新人の質問でも、フォーラムを乱雑にしないように。プロフェッショナルは、通り過ぎないでください。Nowhere without you - 6. - ページ 759

 
Kapizdo4ka:

こんにちは!時々、ifle演算子が効かないことがあるのですが、どうしてか教えてください。
以下はその例です。

Where:
H3はレベルの価格値
priceは現在の価格

結果は、価格がこのレベルに達する(時にはそこで止まる)のですが、Alertは発動しません。
エラーが何なのか教えてください。

この誤差は、価格が水準器の値と 正確に一致することが少ないからである。価格 >= H3 のいずれか、またはエラー範囲を定義します。
 
//+------------------------------------------------------------------+
//|                                                        Ozero.mq4 |
//|                                            Copyright 2014, Vinin |
//|                                             http://vinin.ucoz.ru |
//+------------------------------------------------------------------+
#property copyright "Copyright 2014, Vinin"
#property link      "http://vinin.ucoz.ru"
#property version   "1.00"
#property strict
// -------- переменные --- Н -----
extern double gLot=0.1;            // размер лота для покупки 
extern double gPoint=0.001;
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
// -------- переменные --- К ----- 
int init()
  {
   return(0);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int start()
  {

// Открытие позиции
   if(OrdersTotal()==0)
     {
      Print(" Открытие первой позиции ");
      double _Ask=MarketInfo("GBPUSD",MODE_ASK);
      int ticket=OrderSend("GBPUSD",OP_BUY,gLot,_Ask,15,0,0);
      if(ticket>0)
        {
         Print(" ОРДЕР ОТКРЫТ ",ticket);
        }
     }

   double _Bid=MarketInfo("GBPUSD",MODE_BID); //для цены
   for(int pos=OrdersTotal()-1;pos>=0;pos--)
     {
      if(OrderSelect(pos,SELECT_BY_POS))
        {
         if(OrderOpenPrice()+gPoint<_Bid)
           {
            OrderClose(OrderTicket(),OrderLots(),_Bid,15);
            
ResetLastError();
if(!OrderClose(OrderTicket(),OrderLots(),_Bid,15)) Print("Чё-та не закрылася позиция. Фигня вот такая происходит: "+GetLastError());

           }
        }
     }
   return(0);
  }

おはようございます。

プログラムはこのようになっています。

コンパイルすると出ます。

オゼロ。mq4'オゼロ。mq4 1 1
OrderClose の戻り値を確認する必要があります。
数値」から「文字列」への暗黙の変換 Ozero.mq4 49 117
エラー0件、警告2件1 3


結果」タブには、注文の開始と終了が表示されます。

1 2014.08.25 00:00 購入 1 0.10 1.6550 0.0000 0.0000 0.00 10000.00
2 2014.08.25 06:30 close 1 0.10 1.6562 0.0000 0.0000 0.12 10000.12
3 2014.08.25 06:31購入 2 0.10 1.6564 0.0000 0.0000 0.00 10000.12
4 2014.08.25 10:00 close 2 0.10 1.6574 0.0000 0.0000 0.10 10000.22
5 2014.08.25 10:00購入 3 0.10 1.6576 0.0000 0.0000 0.00 10000.22
6 2014.08.25 12:58 close 3 0.10 1.6586 0.0000 0.0000 0.10 10000.32
7 2014.08.25 12:58購入 4 0.10 1.6590 0.0000 0.0000 0.00 10000.32
8 2014.08.26 13:13 ストップ4でクローズ 0.10 1.6576 0.0000 0.0000 -0.14 10000.18


8 - テスターを閉じて作業を中断した。


次に「ジャーナル」を見てみます。

2014.10.31 07:46:44.837 GBPUSD,M15: 4453ティックイベント(5608バー、340128バーステート)を312876ms以内に処理(合計時間324436ms)。
2014.10.31 07:46:44.837 2014.08.26 13:13 テスター:注文番号4は終了しました。
2014.10.31 07:46:44.798 2014.08.26 13:13ビジュアルテスターが 停止しました。
2014.10.31 07:43:15.315 2014.08.25 12:58 オゼロ GBPUSD,M15: ORDER OPEN 4
2014.10.31 07:43:15.315 2014.08.25 12:58 Ozero GBPUSD,M15: オープン #4 買い 0.10 GBPUSD at 1.6590 ok
2014.10.31 07:43:15.315 2014.08.25 12:58 Ozero GBPUSD,M15: 開く #4 buy 0.10 GBPUSD at 1.6590 ok。
2014.10.31 07:43:15.245 2014.08.25 12:58 Ozero GBPUSD,M15: 閉じていないような気がするのですが。さあ、どうぞ:4108
2014.10.31 07:43:15.245 2014.08.25 12:58 オゼロ GBPUSD,M15: OrderClose error 4108
2014.10.31 07:43:15.245 2014.08.25 12:58 Ozero GBPUSD,M15: OrderClose関数のチケット3が不明です。
2014.10.31 07:43:15.245 2014.08.25 12:58 Ozero GBPUSD,M15: Close #3 GBPUSD 0.10 buy at 1.6576 at price 1.6586.
2014.10.31 07:42:51.123 2014.08.25 10:00 オゼロ GBPUSD,M15: HOLD OPEN #3
2014.10.31 07:42:51.123 2014.08.25 10:00 オゼロ GBPUSD,M15: オープン #3 買い 0.10 GBPUSD at 1.6576 ok
2014.10.31 07:42:51.123 2014.08.25 10:00 オゼロ GBPUSD,M15: オープン #1 ポジション
2014.10.31 07:42:51.059 2014.08.25 10:00 オゼロ GBPUSD,M15:どうしたんだ?さあ、どうぞ:4108
2014.10.31 07:42:51.059 2014.08.25 10:00 オゼロ GBPUSD,M15: OrderClose error 4108
2014.10.31 07:42:51.059 2014.08.25 10:00 Ozero GBPUSD,M15: OrderClose 関数の不明チケット 2枚
2014.10.31 07:42:51.059 2014.08.25 10:00 Ozero GBPUSD,M15: Close #2 GBPUSD 0.10 buy at 1.6564 at price 1.6574.
2014.10.31 07:42:31.473 2014.08.25 06:31 オゼロ GBPUSD,M15: HOLD OPEN 2
2014.10.31 07:42:31.473 2014.08.25 06:31 Ozero GBPUSD,M15: 開く #2 買 0.10 GBPUSD at 1.6564 ok。
2014.10.31 07:42:31.473 2014.08.25 06:31 オゼロ GBPUSD,M15:最初のポジションを開く
2014.10.31 07:42:31.331 2014.08.25 06:30 オゼロ GBPUSD,M15:どうしたんだ?さあ、どうぞ:4108
2014.10.31 07:42:31.331 2014.08.25 06:30 オゼロ GBPUSD,M15: OrderClose error 4108
2014.10.31 07:42:31.331 2014.08.25 06:30 Ozero GBPUSD,M15: OrderClose 関数の不明チケット1枚
2014.10.31 07:42:31.331 2014.08.25 06:30 Ozero GBPUSD,M15: Close #1 GBPUSD 0.10 buy at 1.6550 at price 1.6562.
2014.10.31 07:41:31.966 2014.08.25 00:00 オゼロ GBPUSD,M15: ORDER OPEN 1
2014.10.31 07:41:31.966 2014.08.25 00:00 オゼロ GBPUSD,M15: オープン #1 買い 0.10 GBPUSD at 1.6550 ok
2014.10.31 07:41:31.966 2014.08.25 00:00 オゼロ GBPUSD,M15: オープン #1 買い 0.10 GBPUSD at 1.6550 ok
2014.10.31 07:41:31.958 オゼロ入力:gLot=0.1; gPoint=0.001。

今、私はまったく途方に暮れています。一方では、チャートと結果で見ることができるように、注文は閉じられています。他方では、ログに見られるように、コードはエラーで実行されています: ((((((((((( ;゚Д゚)))))))

オゼロ。

 
同じ注文を2回決済しようとしている。一番上のものを外す。
 
Roger:
同じ注文を2回決済しようとしている。一番上のものを外す。
好ましくは下の方です。順番はあらかじめ決めておく必要があります。
 
            
//ResetLastError();
//if(!OrderClose(OrderTicket(),OrderLots(),_Bid,15)) Print("Чё-та не закрылася позиция. Фигня вот такая происходит: "+GetLastError());

おはようございます。

2行を削除しました。すべてがうまくいく。そして、グラフにも、結果にも、ログにも、すべてが正しく表示されるのです。

質問:コンパイル時に出る


'オゼロ'です。mq4'オゼロ。mq4 1 1
OrderCloseの戻り値を確認する必要があります。
エラー0件、警告1件1 2



コンパイラーは何について警告していますか?46行目はOrderClose(OrderTicket(),OrderLots(),_Bid,15)です。


オゼロ。

 
tuner:

今日発生した不具合は何が原因なのか、皆さん教えてください。

このEAには、金曜日のマーケットクローズ15分前に取引を停止するオプションがあります。

新しい日が表示されたら、EAはそれが金曜日であるかどうかをチェックし、今日はStringToTime("23:59")-15*60で取引を停止します。

テスターでは正常に動作していますが、実際の取引では、金曜日が来るとExpert Advisorが最初のティックで取引を停止してしまうという、全く異なる状況が見られます。

Expert Advisorの日記からプリントを紹介します。

ブローカー1号、デモ

0 05:59:47.731 Scalper GBPAUDpt,M1: Finish In Friday = 2014.10.23 23:44:00

ブローカー2、リアル。

0 03:00:11.999 Scalper EURUSD,M1: Finish In Friday = 2014.10.23 23:44:00

つまり、1ティック目に今日の日足バー(10月24日(金))が表示されると、EA

は、"23:59 "という行を、今日の日を代入するのではなく、昨日の時間に変換します。

しかし、金曜日の日中にExpert Advisorを再起動すると、完了時刻を正しく判断することができます。

この問題の原因がわかりました。https://forum.mql4.com/33023。

予想通り、実質的にはStringToTime 関数のバグである。症状はすべて似ています。この関数は、"23:59 "という文字列を、ローカルPCの日付で日付時刻に変換しますが、MT4の日付には変換しません。そしてテスターでは、ご存知のようにローカルPCの日付をエミュレートして端末の時刻と等しくしています。そのため、テスターではすべて正常に動作するのに、デモ・リアルタイムでは不具合や損失が発生するのです。ドキュメントにはもちろん、日付がどこから来ているのか書かれていませんし、上のリンクではこの問題は4年前に報告されていますが、どうやらmethaquotesは気にしていないようです。

 
      RefreshRates();                     // Обновим данные
      _Bid=MarketInfo( "GBPUSD",MODE_BID);

      if (_Bid>=gPoint1)
        {
           for(pos=OrdersTotal();pos>=0;pos--)
             {
                OrderClose(OrderTicket()-1,OrderLots(),_Bid,15);
             }      
       
        }

もうひとつ質問です。という理解でいいのでしょうか。

1. 注文番号は "0 "から始まります。

2.このコードは、私が手動で開くかプログラムで開くかにかかわらず、絶対にすべての注文を閉じるのですか?つまり、この部分が閉じられないオーダーを見つけることはできないのでしょうか?


オゼロ。

 

画面上でテキストをスクロールさせることをやったことのある人はいますか?例えば、「○○という注文を開けた/閉じた/変更した」等。ニュースです。?

差し支えなければ、コードの一部をお見せください。

ありがとうございます。

 
Vinin:
下の方が良い。順番は事前に決めておく必要があります。

こっちの方がいいんです。

//+------------------------------------------------------------------+
//|                                                        Ozero.mq4 |
//|                                            Copyright 2014, Vinin |
//|                                         http://bomzh_inc.ucoz.ru |
//+------------------------------------------------------------------+
#property copyright "Copyright 2014, Bomzh Inc"
#property link      "http://bomzh_inc.ucoz.ru"
#property version   "1.00"
#property strict
// -------- переменные --- Н -----
input double gLot=0.1;           // Размер лота для покупки 
input double gPoint=0.001;       // Дельта для закрытия 
input string symbol="GBPUSD";    // Рабочая валютная пара
void OnTick() {
   // Открытие позиции
   if(OrdersTotal()==0) {
      int ticket=0;
      double _Ask=SymbolInfoDouble(symbol,SYMBOL_ASK);
      Print(" Открытие первой позиции ");
      ticket=OrderSend(symbol,OP_BUY,gLot,_Ask,15,0,0);
      if(ticket>0) Print("ОТКРЫТ ОРДЕР #"+IntegerToString(ticket));
      }
   //--- Закрытие позиций
   double _Bid=SymbolInfoDouble(symbol,SYMBOL_BID); //для цены
   for(int pos=OrdersTotal()-1;pos>=0;pos--) {
      if(OrderSelect(pos,SELECT_BY_POS)) {
         if(OrderSymbol()!=symbol) continue;
         if(OrderType()!=OP_BUY)   continue;
         if(OrderOpenPrice()+gPoint<_Bid) {
            ResetLastError();
            if(!OrderClose(OrderTicket(),OrderLots(),_Bid,15)) 
               Print("Чё-та не закрылася позиция. Фигня вот такая происходит: "+IntegerToString(GetLastError()));
            }
         }
      }
   //--- End OnTick()
}
//+------------------------------------------------------------------+
 
_new-rena:

画面上でテキストをスクロールさせることをやったことのある人はいますか?例えば、「○○という注文を開けた/閉じた/変更した」等。ニュースです。?

差し支えなければ、コードの一部をお見せください。

センズ!

空のインジケーターウィンドウでスクロールをして いました。これがその機能です。

//+------------------------------------------------------------------+
// Если bool print = true или нет окна индикатора, то функция будет выводить сообщения в журнал
void iPrint(string mess1, int sz=9, color color1=clrDarkGray, 
            string mess2="", color color2=clrDarkGray, 
            string mess3="", color color3=clrDarkGray, 
            string mess4="", color color4=clrDarkGray, 
            bool draws=true) {
   string   NameGrafText, message, nm;
   int      i, y, k, shift, Win_Num=-1, num=0;
   color    cl;
   Win_Num=WindowFind("Win_Inform");
   if (mess1=="") {
      //Print("Func iPrint: Передана пустая строка, выходим");
      return;
      }
   if (!draws || Win_Num<0) {
      message=mess1+mess2+mess3+mess4;
      Print(message); 
      return;
      }
   k=ArraySize(Mass_Name_Message)-1;
   if (StringLen(mess1)>0) num++;
   if (StringLen(mess2)>0) num++;
   if (StringLen(mess3)>0) num++;
   if (StringLen(mess4)>0) num++;
// Смещение и перекрашивание старых сообщений   
   for (i=k; i>=0; i--) {                             
      NameGrafText=Mass_Name_Message[i];           
      if (StringLen(NameGrafText)>0) {
         if (ObjectFind(NameGrafText)==Win_Num) {
            if (i+num>k) {                   // Удаляем самую верхнюю строчку
               ObjectDelete(NameGrafText);  
               Mass_Name_Message[i]="";
               }
            else if (i+num<=k) {             // Сдвигаем и перекрашиваем старые сообщения
               Mass_Name_Message[i+num]=Mass_Name_Message[i];
               y=(int)ObjectGet(NameGrafText, OBJPROP_YDISTANCE);          // старая координата Y
               ObjectSet  (NameGrafText, OBJPROP_YDISTANCE, y+(sz+1)*num); // новая координата Y
               ObjectSet  (NameGrafText, OBJPROP_COLOR, clrDimGray);       // новый цвет
               }
            }
         }
      }
// Вывод новых сообщений
   shift=num;
   uint v=GetTickCount();
   for (i=0; i<num; i++) {
      shift--;
      NameGrafText=Prefix+"_GT_"+IntegerToString(i)+"_"+IntegerToString(v);   // Уникальное имя объекта
      int app=0;
      while (ObjectFind(NameGrafText)==Win_Num) {  // Если всё-таки такой объект есть
         app++;
         NameGrafText=Prefix+"_GT_"+IntegerToString(i)+"_"+IntegerToString(v)+"_"+IntegerToString(app); // добавим к его имени "хвостик"
         }
      Mass_Name_Message[num-1-i]=NameGrafText;
      switch (i) {
         case 0: message=mess1; cl=color1; break;
         case 1: message=mess2; cl=color2; break;
         case 2: message=mess3; cl=color3; break;
         case 3: message=mess4; cl=color4; break;
         default:message=mess1; cl=color1; break;
         }
      ObjectCreate (NameGrafText, OBJ_LABEL, Win_Num, 0, 0);
      ObjectSetText(NameGrafText, message, sz, "Courier New", cl);
      ObjectSet    (NameGrafText, OBJPROP_COLOR, cl);                   // цвет
      ObjectSet    (NameGrafText, OBJPROP_CORNER,    2);                // угол
      ObjectSet    (NameGrafText, OBJPROP_XDISTANCE, 150);              // координата Х
      ObjectSet    (NameGrafText, OBJPROP_YDISTANCE, 2+(sz+1)*shift);   // координата Y
      WindowRedraw();
      }
}
//+------------------------------------------------------------------+

単色メッセージの使用例として(異なる単語を1行で4色にすることができます)。

if(get.BarOpenLastPos(sy,PERIOD_H4,OP_SELL,mn)!=0) {
   string mess1="На D1 вниз, на H4 ниже SAR, M15 сигнал. Продаём";
   iPrint(mess1,9,clrBlue);
   trade.OpenS(sy,lots,mn,0.0,0.0,co);
   }

チャート上にWin_Informという名前の空のインジケータがあるはずです。