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

 

こんにちは、なぜうまくいかないのか、教えてください。エラーはありませんが、テスターで注文が開きません。日足ローソク足の高値・安値をブレイクアウトするEAを トレーニング用として作成 しようとしています。


extern int      TimeCandle   = 1440;      //таймфрейм свечи, которую пробиваем 
extern int      HourStart=10; // час начала торговли
extern double   Lots=0.1;     // лот торговли   
extern int      StopLoss=100; // стоплосс
extern int      TakeProfit=100; // тайкпрофит
extern int      znak=5;     // количество знаков котировки
extern int      magik=54321;     // магик 

double minprice; // минимальная цена
double maxprice;// максимальная цена


void OnTick()
  {
  double SL, TP;
  int ticket;
 
   minprice = iLow(Symbol(),TimeCandle,1);
   maxprice = iHigh(Symbol(),TimeCandle,1);   
   
   if (TimeHour(TimeCurrent()==HourStart))
   { 
    if (BuyLimitCount()==0 && BuyCount()==0) //если нет ордера то пытаться открыть
    { 
    SL = NormalizeDouble(maxprice - StopLoss*Point,znak);
    TP = NormalizeDouble(maxprice + TakeProfit*Point,znak);
    ticket = OrderSend(Symbol(), OP_BUYLIMIT,Lots,maxprice, 10, SL,TP,"", magik,0,Blue);
    
    if (ticket <0)
    Print ("Не удалось открыть ордер на покупку");
    }
    
    
     if (SellLimitCount()==0 && SellCount()==0) //если нет ордера то пытаться открыть
    { 
    SL = NormalizeDouble(minprice + StopLoss*Point,znak);
    TP = NormalizeDouble(minprice - TakeProfit*Point,znak);
    ticket = OrderSend(Symbol(), OP_SELLLIMIT,Lots,minprice,10, SL,TP,"", magik,0,Red);
        
    if (ticket <0)
    Print ("Не удалось открыть ордер на продажу");
    }
    
    }
    Comment ("Минимальная цена:" + DoubleToStr(minprice,znak) + "\n" + "Максимальная цена:"+ DoubleToStr(maxprice, znak)); 
  }
   
  // проверяем есть ли байлимит ордера с конца
  int BuyLimitCount()
  {
  int count = 0;
  for (int i=OrdersTotal()-1;i>=0;i--)
  {
    if (OrderSelect(i, SELECT_BY_POS,MODE_TRADES) == true && 
        OrderMagicNumber()== magik &&                        
        OrderType() == OP_BUYLIMIT )                        
        {
        count ++;
        }
    }
    return(count);  
    
  }
   // проверяем есть ли селллимит ордера с конца
  int SellLimitCount()
  {
  int count = 0;
  for (int i=OrdersTotal()-1;i>=0;i--)
  {
    if (OrderSelect(i, SELECT_BY_POS,MODE_TRADES) == true && 
        OrderMagicNumber()== magik &&                        
        OrderType() == OP_SELLLIMIT )                        
        {
        count ++;
        }
    }
    return(count);      
  }
  
   // проверяем есть ли бай ордера с конца
  int BuyCount()
  {
  int count = 0;
  for (int i=OrdersTotal()-1;i>=0;i--)
  {
    if (OrderSelect(i, SELECT_BY_POS,MODE_TRADES) == true && 
        OrderMagicNumber()== magik &&                        
        OrderType() == OP_BUY )                        
        {
        count ++;
        }
    }
    return(count);      
  }
  
  // проверяем есть ли селл ордера с конца
  int SellCount()
  {
  int count = 0;
  for (int i=OrdersTotal()-1;i>=0;i--)
  {
    if (OrderSelect(i, SELECT_BY_POS,MODE_TRADES) == true &&         
        OrderMagicNumber()== magik &&                        
        OrderType() == OP_SELL )                        
        {
        count ++;
        }
    }
    return(count);      
  }
Как самому создать советника или индикатор - Алгоритмический трейдинг, торговые роботы - MetaTrader 5
Как самому создать советника или индикатор - Алгоритмический трейдинг, торговые роботы - MetaTrader 5
  • www.metatrader5.com
Для разработки торговых систем в платформу встроен собственный язык программирования MetaQuotes Language 5 (MQL5), среда разработки MetaEditor и инструменты тестирования стратегий. Любую информацию о разработке торговых стратегий на языке MQL5 можно найти на официальном сайте MQL5.community. На этом же сайте в разделе Code Base могут быть...
 
nelenaby:

こんにちは、なぜうまくいかないのか、教えてください。エラーはありませんが、テスターで注文が開きません。日足ローソク足の高値・安値をブレイクアウトするEAを トレーニング用として作成しようとしています。


開かない、つまり開こうとしない、あるいは開こうとするが失敗する?ログには何と書いてあるのでしょうか?

 
nelenaby:

こんにちは、なぜうまくいかないのか、教えてください。エラーはありませんが、テスターで注文が開きません。日足ローソク足の高値・安値をブレイクダウンするEAを トレーニング用として作成しようとしています。


あなたのこの表情を分析する

if (TimeHour(TimeCurrent()==HourStart))
        {
          ........
        }

この式の意味がよくわからないので、もしかしたら間違っているかもしれませんが、少なくとも「(TimeCurrent()==HourStart)」は「(TimeCurrent() - HourStart)」に置き換えた方がいいでしょう。

 

次に、私が正しく理解していれば、BuyLimitOrder と BuyPosition がない場合、BuyLimit 注文を出そうとしていることになります。正確には "AND "であることに注意してください。つまり、どれかが別々に存在することが好都合なのです。したがって、現在の価格の 希望する位置で、少なくとも1つがトリガーされ最初のポジションが開くまで、各ティックで1つずつ、無限のByLimitsを得ることができます。また、今の価格がどこであるかは気にしていませんね。時間に関する奇妙な条件が満たされた時点で(ちょうど投稿の上)、エラーが発生していると思いますが、気にしないでください。とにかく、それを無視すると、EAは最初のティックで、価格が昨日の高値に達するまで、間違った注文を出し始めます、なぜなら、昨日の高値を注文の価格として使っているからです。買い指値は現在の価格より下に設定されています。つまり、現在の価格が昨日の高値を上回る必要がありますが、それまでは注文は失敗します。

ですから、あなたに合うのは、価格が昨日の高値を上回り、BuyLimitもなく、未決済の取引もない場合だけです。これは珍しい組み合わせです。その上、ブレイクアウトには影響せず、ブレイクアウト後に跳ね返され(bylimitがあるため)、昨日の最大値を超えた最初のティックから、たくさんのエラーを投げます(これもエラーです)。条件はすでに満たされており、Expert Advisorは注文を投げるが、スプレッドやマーケットからの最小許容距離などもある。

 
Sergey Voytsekhovsky:

この式の意味がよくわからないのですが、もしかしたら間違っているかもしれませんが、せめて「(TimeCurrent()==HourStart)」を「(TimeCurrent() - HourStart)」と置き換えてください。

そうです、ここに誤りがあるのです。必要なのは if (TimeHour(TimeCurrent())==HourStart) です。

現在、注文は時々開きますが、より多くのエラー(OrderSend error 130)が発生します。

指値注文については、こちらのエラーは正しくありません。

 
nelenaby:

そうです、ここにエラーがあるのです。if (TimeHour(TimeCurrent())==HourStart) が必要です。

現在、時々トランザクションを開くことができますが、より多くのエラー(OrderSend error 130)を投げます。

指値注文については、正しくありません。

ここでは、時間を操作するスクリプトを紹介します。

古いものですが、正常に動作しています。

ファイル:
 

こんにちは。

ファイルの扱い方について、ご教授ください。

プログラム実行中に、受信したデータをファイルに保存し、CSVを読み込んでいます。

ファイルが増え、速度が落ちる。行の中の一部の要素を更新(上書き)してみました。まさか!?

選択した行を削除することはできません古い線に新しい要素を加えることができない!

これはとても不思議なことですファイルや グラフィックオブジェクトなどを簡単に削除 することができます。しかし、作成したファイルを扱うとなると、絶対にデッドロックになるのです

フォーラムでは、「ファイルをメモリに読み込んで、行を変更または削除し、新しいファイルを古い名前で保存する」という1つの推奨事項しかありません。

これは正しい解決策とは思えません。何か見落としていたようだ。どうか解明してください。

 
im-zvv:

私にはそれが正しい判断とは思えません。何か見落としているのかもしれません。どうか解明してください。

あなたはマイクロソフトに緊急採用され、このファイル操作の「間違った解決 法」を最終的に修正すべきです。


ファイルハンドリングは、ファイルエディターで編集するようなものではなく、個々の文字でサイコロを振って言葉を作っていくようなものです。
新しい文字を入れる場合は、その文字に続くすべてのキューブを右に移動する必要があります。
古い文字を削除する場合は、それに続くすべてのサイコロを左側に移動する必要があります。
したがって、ファイルが大きくなく、ファイルにアクセスする必要のない作業であれば、新しいファイルにデータを書き込み、古いファイルを削除し、新しいファイルの名前を古いファイルの名前に変更する方が確かに簡単である。

私の記憶違いでなければ、ファイルを扱う際にMQLに唯一欠けているのは、ファイルの長さを必要なサイズに切り詰める機能です。


 
Alekseu Fedotov:

ここでは、時間を扱うスクリプトを紹介します。

古いものですが、正常に動作しています。

私も以前はキムさんの機能を使っていましたが、時間を見つけては自分で書いています。

//_______________________________________________________________________
class CWorkTime
  {
private:
   int               mday,mstarthour,mstophour,mstartmin,mstopmin;
   datetime          mstarttime,mstoptime;
   bool              UseThisSession;
   void inittime()
     {
      mday=Day();
      MqlDateTime dtstart,dtstop;
      TimeToStruct(TimeCurrent(),dtstart);
      dtstop=dtstart;
      dtstart.hour= mstarthour;
      dtstart.min = mstartmin;
      dtstop.hour = mstophour;
      dtstop.min = mstopmin;
      mstarttime = StructToTime(dtstart);
      mstoptime=StructToTime(dtstop);
     }
public:
   void              CWorkTime(void){};
   void              ~CWorkTime(void){};
   void              CWorkTime(int hstart,int mstart,int hstop,int mstop)
     {
      mstarthour=hstart;
      mstartmin = mstart;
      mstophour=hstop;
      mstopmin=mstop;
      UseThisSession=(mstarthour<0 || mstophour<0 || mstarthour>23 || mstophour>23) ? false : true;
      UseThisSession=(mstartmin<0 || mstopmin<0 || mstartmin>59 || mstopmin>59) ? false : true;
      if(UseThisSession) inittime(); else Print("Время работы советника не используется");
     };

   bool              Disable()
     {
      bool result=false;
      if(UseThisSession)
        {
         if(mday!=Day()) inittime();
         datetime t=TimeCurrent();
         result=t>=mstarttime && t<=mstoptime ? false : true;
        }
      return(result);
     };
  }
*Work;


.....

int OnInit()
{
   Work=new CWorkTime(StartHour,StartMinute,StopHour,StopMinute);
}

.....


void OnTick()
  {

if(Work.Disable())
{
 Comment("Не торговое время!!! Сопровождение открытых ордеров");
 }
else
{......
ランタイムの無効化 - コンストラクタの初期化時に無効なデータを入力する必要があります(例:25時間、70分)。
 
Sergey Dzyublik:

あなたはマイクロソフトに雇われ、このファイル操作の「間違った解決 策」を最終的に修正することが急務です。


ファイルでの作業は、ファイルエディターで編集するようなものではなく、個々の文字でサイコロを振って言葉を作っていくようなものです。
新しい文字を入れる場合は、その文字に続くすべてのキューブを右に移動する必要があります。
古い文字を削除する場合は、それに続くすべてのサイコロを左側に移動する必要があります。
したがって、ファイルが大きくなく、ファイルにアクセスする必要のない作業であれば、新しいファイルにデータを書き込み、古いファイルを削除し、新しいファイルの名前を古いファイルの名前に変更する方が確かに簡単である。

私の記憶違いでなければ、ファイルを扱う際にMQLに唯一欠けているのは、ファイルの長さを必要なサイズに切り詰める機能です。


ありがとうございます。分かりやすくて良い。残念ながら、私のファイルは非常に大きいので、「キューブ」を使って作業する必要があります。
理由: