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

 
Renat Akhtyamov:
int ticket;//тикет ордера
..........
ticket=OrderSend(.....);//приказ и запоминаем тикет ордера
if(ticket>0)//открылась
{
//действия с тикетом
}

より正確には、次のようになります。

if(ticket!=-1)//открылась
{
//действия с тикетом
}

OrderSend- "トレードサーバーがオーダーに割り当てたチケット番号を返すか、失敗した場合は-1を返します "

テスターでも最初のチケット番号は0でなく1ですが。

 
Oksana Berenko:

より正確には、そうなります。

if(ticket!=-1)//открылась
{
//действия с тикетом
}

OrderSend - "トレードサーバーがオーダーに割り当てたチケット番号を返すか、失敗した場合は-1を返します "

テスターでも最初のチケット番号は0でなく1ですが。

行方不明のオクサナに会えてとてもうれしいです ))

確かに、テスターでもDCサーバーでもチケットは1から始まりますが、DCで1が獲れることはないでしょう。不等号と-1を比較するのは正しくありません。実アカウントが 1234567を返したらどうする?

if(ticket>0)//открылась
{
//действия с тикетом
}


// так верно
 

だから、テスターではチケットは1より小さくはできないし、実世界ではなおさらだ

ゼロが1より小さい場合、両方の条件が正しく、一方だけが比較のため、もう一方は除外のためです。

慣れたとはいえ

// Открываем ордер
      int ticketbuy = OrderSend(sy,OP_BUY,ll,MarketInfo(sy,MODE_ASK),Slippage,0,0,Comments,mn,0,BuyColor);
         if(ticketbuy<0)
         Print(sy," OpenPosition. OrderSend Buy fail #",GetLastError());
         else
         Print(sy," OpenPosition. OrderSend Buy successfully");

しかし、私のを考えると、条件はすべて正しく、ロジックが違うだけです)

 
こんばんは、新年おめでとうございます。 このコードのどこがおかしいのか、教えていただけませんか?
void CloseOrder(int type)
  {
   bool ret;
   int error=0;
   double price=0.0;
   int total=OrdersTotal();
   if(!disabled(_Symbol))
     {
      Print(rezult);
      return;
     }
   for(int i=total-1; i>=0; i--)
     {
      if(!OrderSelect(i,SELECT_BY_POS))continue;
      if(OrderSymbol()!=_Symbol)continue;
      if(OrderMagicNumber()!=Magic)continue;
      if(OrderType()>1)continue;
      if(OrderType()!=type)continue;
      int digits=(int)SymbolInfoInteger(OrderSymbol(),SYMBOL_DIGITS);
      if(OrderType()==OP_BUY)price=NormalizeDouble(SymbolInfoDouble(OrderSymbol(),SYMBOL_BID),digits);
      if(OrderType()==OP_SELL)price=NormalizeDouble(SymbolInfoDouble(OrderSymbol(),SYMBOL_ASK),digits);

      if(NormalizeDouble(NormalizePrice(OrderSymbol(),price),digits)!=price)continue;
      ret=OrderClose(OrderTicket(),OrderLots(),price,Slippage,clrLawnGreen);
      if(!ret)
        {
         error=GetLastError();
         rezult=StringConcatenate(OrderSymbol(),": error close order ",OrderTicket()," ",DoubleToString(OrderLots(),2)," ",TypeToStr(OrderType())," №- ",error," ",ErrorDescription(error));
         Print(rezult);
        }
      else
        {
         rezult=StringConcatenate(OrderSymbol(),": close order ",OrderTicket()," ",DoubleToString(OrderLots(),2)," ",TypeToStr(OrderType()));
         Print(rezult);
        }

     }
  }
 
Movlat Baghiyev:
新年おめでとうございます!このコードのどこがおかしいのか、教えていただけませんか?

ルートでロジックを変更することをお勧めします

すなわち、売りが何本、買いが何本というように、オープンオーダーの記録を残すことが必要です

そして、これらの考察に基づいて、注文を管理すること、つまり、注文を開いたり閉じたりすることです。

 

ポジションを建てる条件でないはずなのに、なぜEAがたくさん注文を出すのか分かりませんが、出した後にまた注文を出します。

私のEAは、ポジションを開かせたくないのに、なぜ多くの注文を開くのか理解できませんが、私が開いた後に再び開きます。

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

if(OrderSelect(i,SELECT_BY_POS))

if(OrderMagicNumber()==magic) // 私たちのMagicなら

{

if(OrderType()==OP_BUY) sdel_b++; // baiをカウントする。

if(OrderType()==OP_SELL) sdel_s++; // 売り数を数える。

if(OrderType()==OP_BUYSTOP) otl_b++; // バイストップ待ちを数える

if(OrderType()==OP_SELLSTOP) otl_s++; // 保留中のセルストップをカウントする。

}


// 注文受付中

if(Hour()==00 && Minute()==01 && otl_b==0 && otl_s ==0); // 時刻で、保留中の注文がない場合。

{

OrderSend (Symbol(),OP_BUYSTOP,lot,Vhod1,20,SL2,TP,NULL,magic,0,clrNONE); // 保留注文を出す。

OrderSend (Symbol(),OP_SELLSTOP,lot,Vhod2,20,SL,TP2,NULL,magic,0,clrNONE); //

}

 
wishmast:

ポジションを建てる条件でないはずなのに、なぜEAがたくさん注文を出すのか分かりませんが、出した後にまた注文を出します。

私のEAは、ポジションを開かせたくないのに、なぜ多くの注文を開くのか理解できませんが、私が開いた後に再び開きます。

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

if(OrderSelect(i,SELECT_BY_POS))

if(OrderMagicNumber()==magic) // 私たちのMagicなら

{

if(OrderType()==OP_BUY) sdel_b++; // baiをカウントする。

if(OrderType()==OP_SELL) sdel_s++; // 売り数を数える。

if(OrderType()==OP_BUYSTOP) otl_b++; // バイストップ待ちを数える

if(OrderType()==OP_SELLSTOP) otl_s++; // 保留中のセルストップをカウントする。

}


// 注文受付中

if(Hour()==00 && Minute()==01 && otl_b==0 && otl_s ==0); // 時刻で、保留中の注文がない場合。

{

OrderSend (Symbol(),OP_BUYSTOP,lot,Vhod1,20,SL2,TP,NULL,magic,0,clrNONE); //ポジションを取る。

OrderSend (Symbol(),OP_SELLSTOP,lot,Vhod2,20,SL,TP2,NULL,magic,0,clrNONE); //

}

お試しください

   sdel_b=0;
   sdel_s=0;
   otl_b=0;
   otl_s=0;
   for(int i=OrdersTotal()-1;i>=0;i--)
     {
      if(OrderSelect(i,SELECT_BY_POS))
        {
         if(OrderMagicNumber()==magic) // Если наш Меджик
           {
            if(OrderType()==OP_BUY) sdel_b++; // Считаем баи
            if(OrderType()==OP_SELL) sdel_s++; // Считаем селы
            if(OrderType()==OP_BUYSTOP) otl_b++; // Считаем отложенные байстопы
            if(OrderType()==OP_SELLSTOP) otl_s++; // Считаем отложенные селлстопы
           }
        }
     }

....
 
Sergey Gritsay:

お試しください

   sdel_b=0;
   sdel_s=0;
   otl_b=0;
   otl_s=0;
   for(int i=OrdersTotal()-1;i>=0;i--)
     {
      if(OrderSelect(i,SELECT_BY_POS))
        {
         if(OrderMagicNumber()==magic) // Если наш Меджик
           {
            if(OrderType()==OP_BUY) sdel_b++; // Считаем баи
            if(OrderType()==OP_SELL) sdel_s++; // Считаем селы
            if(OrderType()==OP_BUYSTOP) otl_b++; // Считаем отложенные байстопы
            if(OrderType()==OP_SELLSTOP) otl_s++; // Считаем отложенные селлстопы
           }
        }
     }

....
今もなお、多くの注文を受け付けている
148未決済・保留の注文 数が、ブローカーが設定した上限に達した。
 
wishmast:
今でも多くの注文を受け付けています
148未決済・保留の注文 数が、ブローカーが設定した上限に達した。
どこを間違えているのかわかりにくいので、コード全体をお送りください。
 

ごあいさつ皆さん、明けましておめでとうございます。

EAを実行した後に最適化しようとすると、結果や最適化グラフが空白になり、ログに書き込まれます。

最適化中に2つのパスが行わ れましたが、2つの結果は重要でないとして 破棄されました。

遺伝的アルゴリズム"のチェックを外しても、解決しない。テスターにとっては取るに足らない結果に見えるのはわかりますが、どうすればそこにあるものを見ることができるのでしょうか。しかも、テスト中のExpert Advisorは同期間(1年間)損をしないにもかかわらず、±20%という結果です。