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

 
Vyacheslav Kornev:

お世話になります、でも実際の取引では価格の取り方に違いはないのでしょうか? やはり、インジケーターとEAを両方チャートに載せないといけないのでしょうか?

実際の取引では、データを取得することができるようになります。間違ってインジケーターの線を 消してしまわない限りは...。

 
Artyom Trishkin:

本物を使えば、データを受信することができるようになります。誤って表示 線を外してしまわなければ...。


そこで、もう一つ質問があるのですが、これはすごいEAですね。しかし、あるラインを越えたら、その方向に追加注文を出し、利益確定する...ということをする必要があります。利益確定後、指標線が更新されるまで追加注文を出さないようにするにはどうしたらいいですか?

//=============================== 追加注文の設定 ================================================================
double Lots2;
if((PriceHigh>PriceLow && Ask>PriceHigh && LBUY<LSELL)|| (PriceLow>PriceHigh && Ask>PriceLow && LBUY<LSELL) )
 

こんにちは!コードに少し手助けが必要です。

ファイル11112222.txtに1が含まれている場合、BUYを開く。

は、ファイル11112222.txtに-1が含まれている場合、売りを開始します。

ファイル11112222.txtに0が含まれている場合、すべての注文を閉じます。


ファイル11112222.txtがある場合、1、-1、0の3つしかない。


このコードの何が問題なのか理解できません。なぜか、ファイル11112222.txtに0があると、クローズドオーダーのコードではなく、BUYオーダーを開いてしまうのです。

Ay、問題もあります。EAが動いているとき、ほとんどいつも11112222.txtを開くことができません。ファイルが他のアプリケーションでビジー状態になっていると言うので、この問題を解決するために、" FileClose(handle2); // Close text file "をあらゆるところに配置しました。しかし、それは助けになりません。EAに、開いた後にファイル 11112222.txtに1、-1または0を記録していることをチェックして閉じさせる必要があります。このファイルは他のプログラムにより、周期的に1、-1または0が使用されているからです。

//=================================BUY=========================================
    int handle2 = FileOpen("11112222.txt", FILE_CSV|FILE_READ, ";");//код открывает файл для чтения
  if(handle2>0) // если в файле больше 0, то есть 1, то открывать BUY
   {
    
       Print(FileReadString(handle2));
       FileClose(handle2); // закрытие текстового файла

                    //ОТКРЫТИЕ ОРДЕРА НА ПОКУПКУ      
                    if(OrdersTotal() == 0) // если нет открытых ордеров то открывать ордер на покупку
                     {
                        OrderSend(Symbol(), OP_BUY, 0.01, Ask, 3, 0, 0); // первым указывается ЛОСЬ, вторым ПРОФИТ
                        FileClose(handle2); // закрытие текстового файла
                     }
                    else
                      Print("NE USPESHNO!!!");
                      FileClose(handle2); // закрытие текстового файла

   }
//=================================конец кода BUY=========================================
      
      
      
      
      
      
      
      
//=================================SELL=========================================
    int handle3 = FileOpen("11112222.txt", FILE_CSV|FILE_READ, ";");//код открывает файл для чтения
  if(handle3<0)//если в текстовом файле меньше 0, то есть -1, то открывать SELL
   {
    
       Print(FileReadString(handle3));
       FileClose(handle3); // закрытие текстового файла

                    if(OrdersTotal() == 0) // если нет открытых ордеров то открывать ордер на продажу
                        {
                           OrderSend(Symbol(), OP_SELL, 0.01, Bid, 3, 0, 0); // первым указывается ЛОСЬ, вторым ПРОФИТ
                           FileClose(handle3); // закрытие текстового файла
                        }
                       else
                       Print("NE USPESHNO!!!");
                       FileClose(handle3); // закрытие текстового файла

   }
//=================================конец кода SELL=========================================
      
      
      
      
      
//=================================ЗАКРЫТИЕ ВСЕХ ОРДЕРОВ=========================================
    int handle4 = FileOpen("11112222.txt", FILE_CSV|FILE_READ, ";");//код открывает файл для чтения
  if(handle4=0)//если в текстовом файле равно 0, то закрыть все ордера
   {
      
       Print(FileReadString(handle4));
       FileClose(handle4); // закрытие текстового файла
//-----------------код закрывает все ордера--------------------
   bool   result;
   int    error;

 while (OrdersTotal()>0)
 {
   if(OrderSelect(0,SELECT_BY_POS,MODE_TRADES))
     {   if(OrderType()==OP_BUY)  result=OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(MarketInfo(OrderSymbol(),MODE_BID),MarketInfo(OrderSymbol(),MODE_DIGITS)),3,CLR_NONE);
          if(OrderType()==OP_SELL) result=OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(MarketInfo(OrderSymbol(),MODE_ASK),MarketInfo(OrderSymbol(),MODE_DIGITS)),3,CLR_NONE);
          if (OrderType()==OP_BUYLIMIT || OrderType()==OP_BUYSTOP || OrderType()==OP_SELLLIMIT || OrderType()==OP_SELLSTOP)
           OrderDelete(OrderTicket());
          
           if(result!=TRUE) { error=GetLastError();
              Print("LastError = ",error, " ",Symbol()); }
           else error=0; }
   else Print( "Error when order select ", GetLastError());
         
         FileClose(handle4); // закрытие текстового файла
  }
//------------конец кода закрывающего ордера------------------
 

         FileClose(handle4); // закрытие текстового файла
      
      
   }
//=================================конец кода ЗАКРЫТИЕ ВСЕХ ОРДЕРОВ=========================================


 
Санек:

こんにちは!コードに少し手助けが必要です。

ファイル11112222.txtに1が含まれている場合、BUYを開く。

は、ファイル11112222.txtに-1が含まれている場合、売りを開始します。

ファイル11112222.txtに0が含まれている場合、すべての注文を閉じます。


11112222.txtというファイルがあり、1、-1、0の3つの項目しかない可能性があります。


ファイル11112222.txtに0があると、クローズ注文のコードが発動されるはずなのに、なぜかBUY注文を開いてしまいます;何がエラーなのかわかりません。

そこでまた問題があって、EAが動いているとき、11112222.txtを開くと、他のアプリケーションでファイルがビジー状態になっていると言われて、ほとんど開けません。 それを解決するために、FileClose(handle2); // Close text file; としましたがうまくいかず、EAが11112222.txtに 1、-1、0が入っているかをチェックして閉じる必要があります、毎秒他のプログラムでこのファイルを使って1、-1、0を入れているわけですからね。

ファイルハンドルはファイルの中身ではないため。

まずファイルの中身を読んでから、条件を設定する必要があります。逆で、ハンドルで条件を決めてから、ファイルを読み込んでクローズするんですね。

 
Alexey Viktorov:

なぜなら、ファイルのハンドルは、ファイルの中身ではないからです。

まずファイルの中身を読んでから、条件を入れるのです。あなたの場合、その逆で、ハンドルで条件設定し、ファイルを読み込んで閉じます。

1) - ファイル 11112222.txt を開き、そこからデータを読み込む部分です。

//=================================BUY=========================================
    int handle2 = FileOpen("11112222.txt", FILE_CSV|FILE_READ, ";");//код открывает файл для чтения

2) - 次に、handle2>0であれば、その条件となります。


  if(handle2>0) // если в файле больше 0, то есть 1, то открывать BUY
   {

3)-ここが理解できないところです。


       Print(FileReadString(handle2));

4) - この部分はファイルを閉じます。


       FileClose(handle2); // закрытие текстового файла

5) - handle2>0 の条件を満たしているので、つまりファイル11112222.txtに1が含まれているので、買い注文を 出す。

  //ОТКРЫТИЕ ОРДЕРА НА ПОКУПКУ      
                    if(OrdersTotal() == 0) // если нет открытых ордеров то открывать ордер на покупку
                     {
                        OrderSend(Symbol(), OP_BUY, 0.01, Ask, 3, 0, 0); // первым указывается ЛОСЬ, вторым ПРОФИТ
                        FileClose(handle2); // закрытие текстового файла
                     }
                    else
                      Print("NE USPESHNO!!!");
                      FileClose(handle2); // закрытие текстового файла

   }
//=================================конец кода BUY=========================================

どの部分が混同してしまったのでしょうか?
 

注文をクローズするスクリプトを作成しようとしているのですが。

#property copyright "Copyright 2017, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property strict
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
{  
   bool reasult;
   for (int i = OrdersTotal()-1; i >= 0; i--)
   {
      if (OrderSelect(i, SELECT_BY_POS)>0)
      {
         if (OrderSymbol() != Symbol())
            continue;
         
         switch (OrderType())
         {
            case OP_BUY  :
               reasult = OrderClose(OrderTicket(), OrderLots(), Bid, 50, Red);
               if (!reasult) Print ("Ошибка закрытия ордера на покупку", GetLastError());
               break;
            case OP_SELL :
               reasult = OrderClose(OrderTicket(), OrderLots(), Ask, 50, Blue);
               if (!reasult) Print ("Ошибка закрытия ордера на продажу", GetLastError());
               break;
         }   
         
      }
   }
}

複数の売り注文と 買い注文を交互に開き、この注文で決済しようとすると、いくつかの注文だけが決済され、残りはエラー129(価格が正しくありません)が発生します。

例えば、注文数に応じて10回試行し、エラー時には一時停止するようなスクリプトを作ろうとしました。

#property copyright "Copyright 2017, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property strict


//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
{ 
   int c=CountTrades()*10;
   
   for ( int a=1 ; a<=c; a++)
   {
   if (CountTrades()==0) { Print ("Orders are successfully closed! Break."); break;}
    Print("Try ", a, " out of ", c);
      
      bool reasult;
      for (int i = OrdersTotal()-1; i >= 0; i--)
      {
         if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
         {
            if (OrderSymbol() == Symbol()) 
            
            {      
            
            if (OrderType() == OP_BUY)  {
                  reasult = OrderClose(OrderTicket(), OrderLots(), Bid, 50, Red);
                  if (!reasult) {Print ("ERROR ", GetLastError());} 
                  }
            if (OrderType() == OP_SELL)  {
                  reasult = OrderClose(OrderTicket(), OrderLots(), Ask, 50, Blue);
                  if (!reasult) {Print ("ERROR ", GetLastError());}  
                  }              
            }   
            
         }
      }Sleep(1000);
   }   
}
//+------------------------------------------------------------------+
int CountTrades()
{
    int count=0;
    for (int i=OrdersTotal()-1; i>=0; i--)
    {
        if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
        {
           if (OrderSymbol() == Symbol())
               if (OrderType() == OP_BUY || OrderType() == OP_SELL)
                 count++;
        }
    }
    
    return(count);
}

通常、何度も試行錯誤を繰り返した後、同じ129エラーが発行される。しかし、それは多くの試みと、注文を閉じるためにアウトが手動で閉じることができ、これはエラーが発生しないが、彼らは閉じます。

私は何を間違えているのだろう?

 
Andrey Sokolov:

注文をクローズするスクリプトを作成しようとしているのですが。

複数の売り注文と 買い注文を交互に開き、この注文で決済しようとすると、いくつかの注文だけが決済され、残りはエラー129(価格が正しくありません)が発生します。

例えば、注文数に応じて10回試行し、エラー時には一時停止するようなスクリプトを作ろうとしたのです。

通常、何度も試行錯誤を繰り返した後、同じ129エラーが発行される。しかし、それは多くの試みと、注文を閉じるためにアウトが手動で閉じることができ、これはエラーが発生しないが、彼らは閉じます。

私は何を間違えているのだろう?

            RefreshRates(); // Попробуйте добавить
            if (OrderType() == OP_BUY)  {
                  reasult = OrderClose(OrderTicket(), OrderLots(), Bid, 50, Red);
                  if (!reasult) {Print ("ERROR ", GetLastError());} 
                  }
            if (OrderType() == OP_SELL)  {
                  reasult = OrderClose(OrderTicket(), OrderLots(), Ask, 50, Blue);
                  if (!reasult) {Print ("ERROR ", GetLastError());}  
                  }  

一般的に、あなたが書いたものは、実際の口座で取引することはできません、それはテスターのためだけです

 
Vitaly Muzichenko:

一般的に、あなたが書いたものは、実際の口座で取引されるべきではなく、それはテスターのためだけです

            RefreshRates(); // Попробуйте добавить

助かります、ありがとうございます。

 
Vitaly Muzichenko:

一般的に、あなたが書いたものは、実際の口座で取引することはできません、それはテスターのためのものです


なぜ「取引不可...」なのか、詳しく教えてください。

 
Andrey Sokolov:

なぜ「取引不可」なのか、詳しく教えてください。

エラーのチェックもなく、サーバーが終了してクリティカル エラーが発生しても、Expert Advisorはサーバーを叩き続けるので、これ以上の自動売買は禁止されているような臭いがします。