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

 

何が問題なのか理解できないのですが?

int start() 

{

bool i;

int ticket;

double Pricem;

datetime Timen; 

string Symb=Symbol();

ticket=OrderSend(Symb,OP_SELL,0.1,Bid,3,Ask+4*Point,Ask-12*Point);

i=OrderSelect(0,SELECT_BY_POS);

while(true)

{

RefreshRates();

Timen=OrderCloseTime();

  if(Timen>0)

   {

     Pricem=OrderClosePrice();

     Alert(Pricem);

     Alert("ордер закрылся");

     Sleep(30000);

 }

 Sleep(10);

 }

return;                              

}


閉じるメッセージが表示されるはずです。注文が開き、ストップ高になり、クローズして終了です。どこにエラーがあるのか?
 

MQL4ツールを使って、開いているチャートをすべて閉じるという作業を解決しています。異なる通貨ペアで3つのチャートを開いており、これがスクリプトのコードです。

   for (int i=1;i<=3;i++) {
      long current=ChartID();
      Print("итерация цикла: ",i,", идентификатор текущего графика ",current);
      bool result=ChartClose(current);
      if(result)Print("окно успешно закрыто");
      else Print("не удалось закрыть окно с идентификатором: ", current);
   }

スクリプトを実行すると、3つのチャートのうち1つだけが閉じられ、以下はログからのプリントです。

AUDUSD,H1: итерация цикла: 1, идентификатор текущего графика 130627565403660021
AUDUSD,H1: окно успешно закрыто
AUDUSD,H1: итерация цикла: 2, идентификатор текущего графика 130627565403660021
AUDUSD,H1: окно успешно закрыто
AUDUSD,H1: итерация цикла: 3, идентификатор текущего графика 130627565403660021
AUDUSD,H1: окно успешно закрыто

一方のチャートを閉じた後、現在のチャートはもう一方のチャートになるはずですが、という意味です。

1.最初のチャートが閉じられた後、ChartID 関数は、現在の チャートの代わりに、 閉じられたチャートの 識別子を返します。

2.C hartClose()関数を 2回、3回と繰り返すとtrueが返され、すでに閉じたウィンドウが正常に閉じられることを意味します...

バグはどこにあるのか、どうすれば解決するのか、誰か知っていますか?

 
CJIeCaPb:

何が問題なのか理解できないのですが?

閉じるメッセージが表示されるはずです。注文が開き、ストップ高になり、クローズして終了です。どこにエラーがあるのか?

OrderSelect() はwhileループの中でないといけないと思いますし、しかも閉じた後のポジション番号が違ってくるので、この場合はチケットで選択した方が良いと思います。
 
tuner:
OrderSelect()はwhileループの中にあるべきで、しかも閉じた後ではポジション番号が違ってくるので、この場合はチケットから選択した方が良いと思います。
やったー、うまくいった! ありがとう
 
tuner:

MQL4ツールを使って、開いているチャートをすべて閉じるという作業を解決しています。異なる通貨ペアで3つのチャートを開いており、これがスクリプトのコードです。

スクリプトを実行すると、3つのチャートのうち1つだけが閉じられ、以下はログからのプリントです。

一方のチャートを閉じた後、現在のチャートはもう一方のチャートになるはずですが、という意味です。

1.最初のチャートが閉じられた後、ChartID 関数は、現在のチャートの代わりに、閉じられたチャートの識別子を返します

2.C hartClose()関数を 2回、3回と繰り返すとtrueが返され、すでに閉じたウィンドウが正常に閉じられることを意味します...

バグはどこにあるのか、どうすれば解決するのか、誰か知っていますか?

//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
//---
   long currChart,prevChart=ChartFirst();
   int i=0,limit=100;
   while(i<limit)
     {
      currChart=ChartNext(prevChart);
      if(currChart<0) break;  
      prevChart=currChart;
      ChartClose(currChart);
      i++;
     }
     ChartClose(ChartFirst());
  }
//+------------------------------------------------------------------+
 

pako さん、うまくいくときといかないときがあります、なぜでしょう...。エラーが発生するのですが。

2014.12.11 17:52:12.456 Access violation read to 0x09295000 in 'C:\.ex4'.

スクリプトが投げられたチャートを閉じようとして いるからではないでしょうか?

PSは、左から1番目のチャートにスクリプトが添付されていれば正しく動作します。しかし、他のチャートに配置すると、エラーが発生します。

 
tuner:

pako さん、うまくいくときといかないときがあります、なぜでしょう...。エラーが発生するのですが。

2014.12.11 17:52:12.456 Access violation read to 0x09295000 in 'C:\.ex4'.

スクリプトが投げられたチャートを閉じようとしているからではないでしょうか?

PSは、左から1番目のチャートにスクリプトが添付されていれば正しく動作します。しかし、他のチャートに配置すると、エラーが発生します。

//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
//---
   long currChart,prevChart=ChartFirst();
   int i=0,limit=100;
   while(i<limit)
     {
      currChart=ChartNext(prevChart);
      if(currChart<0) break; 
      ChartClose(currChart); 
      prevChart=currChart;
      i++;
     }
     ChartClose(ChartFirst());
  }
//+------------------------------------------------------------------+
 

みんな、助けてくれ

問題は、注文を損切りしないように変換する以下の関数で、円ペアに設定し、すべてのオープンオーダーを損切りしないようにすると、正しく動作しなくなる。

5桁に設定しても0に戻ってしまうが、5桁に設定すれば問題なく動作するのが一番良い。

このような作業の理由は何ですか? 何が正しい実行が行われたように、これらの関数を考慮する必要があり、私はそれを3または5桁を投げたどのウィンドウでEA操作に依存しない?

ありがとうございました。

    }

 //==================================================================================================

 // функция перевода ордеров стоп лоса в без убыток по всем открытым ордерам

 //==================================================================================================

 if(_Simbol==false)//если false то по всем ордерам открытым 

 { 

   for(int i=0;i<OrdersTotal();i++)//цикл перебора ордеров

     {

       if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))//будем искать следующие

         {

           if(OrderType()==OP_BUY) //если тип бай

            {

             double  bid=MarketInfo(OrderSymbol(),MODE_BID);//последний известный бид инструмента

             double  point=MarketInfo(OrderSymbol(),MODE_POINT);//чему равен пункт инструмента

             

               if(OrderStopLoss()<OrderOpenPrice())//если стоп лос меньше цены открытия

                {

                  if(bid-Dist_Perivoda*point>OrderOpenPrice())//бид-профит*пункт больше цены открытия

                   {//модифицируем стоп лос

 bool ord_modifik=OrderModify(OrderTicket(),OrderOpenPrice(),OrderOpenPrice()+NormalizeDouble(Level_Zahiti*point,Digits),OrderTakeProfit(),0,clrNONE);

              if(!ord_modifik)//если не получилось

              Comment(GetLastError());//номер ошибки в угол

                   }

                   

                }

            }

            if(OrderType()==OP_SELL)//если тип селл

            {

              double ask=MarketInfo(OrderSymbol(),MODE_ASK);//последний известный аск инструмента

              double  point=MarketInfo(OrderSymbol(),MODE_POINT);//чему равен пункт инструмента

              

              if(OrderStopLoss()==0||OrderStopLoss()>OrderOpenPrice())//если стоп лос больше цены открытия или равен нолю

              {

                if(ask+Dist_Perivoda*point<OrderOpenPrice())//аск +профит*пункт меньше цены открытия

                  {//модифицируем стоп лос

  bool ord_modifik=OrderModify(OrderTicket(),OrderOpenPrice(),OrderOpenPrice()-NormalizeDouble(Level_Zahiti*point,Digits),OrderTakeProfit(),0,clrNONE);

                  if(!ord_modifik)//если не получилось

                  Comment(GetLastError());//номер ошибки в  угол

                  }

                }

             } 

          }

       }

    }

  

 
pako:

コードありがとうございます!まだ時々エラーが出ますが、要点は理解できました。

チャートIDを表示する機能を実験してみました。ドキュメントにあるChartFirst() とは何かは全く不明で、どうにでも解釈できます。左から順に最初に開いたチャートを意味するのか、開いているすべてのチャートから(時間的に)最初に開いたチャートを意味するのか、あるいはターミナルで最初に開いたチャート(今開いている可能性はほぼゼロなので閉じる意味はない)を意味するのか、です。この関数が、今開いているチャートのIDを返すのを見たことがないので、私は後者のバージョンに傾倒しています。

 
tuner:

コードありがとうございます!まだ時々エラーが出ますが、要点は理解できました。

チャートIDを表示する機能を実験してみました。ドキュメントにあるChartFirst() とは何か は全く不明で、どうにでも解釈できます。左から順に最初に開いたチャートを意味するのか、開いているすべてのチャートから(時間的に)最初に開いたチャートを意味するのか、あるいはターミナルで最初に開いたチャート(今開いている可能性はほぼゼロなので閉じる意味はない)を意味するのか、です。この関数が現在開いているチャートのIDを返すのを見たことがないので、私は後者のバージョンに傾倒しています。

チャートファースト

クライアント端末の最初のチャ ートのチャート ID を返します。

一番左のグラフと理解しています