エラー、バグ、質問 - ページ 1521

 
Ilya Malev:
リダクタで作成したデフォルトのインジケータのOnCalculateにテキストを挿入します。任意のチャートに配置します。チャートウィンドウの左上に、インジケータの動作が表示されます。インジケーターの一覧から「削除」を選択した後も、動作は停止しませんので、左上に 表示されていることを確認してください。ウィンドウを閉じた後も継続されます。新しいウィンドウを開いた後、新しいウィンドウで続きが表示されます。このウィンドウは、必ずしも最初に持っていたものと同じシンボルを持つわけではありません :)
端子を閉じたときのみ、インジケーターの動作が停止します。しかも、止まるか止まらないかわからない......ただ、タスクマネージャで手動で端末を削除して再起動させただけなのに......。

同時に、IsStopped関数のヘルプには、mql-programを終了させるコマンドがあった場合、3秒後にプログラムの動作を強制的に終了させることが書かれています。

また、while(true)をwhile(!IsStopped())に置き換えると、チャートから削除してもインジケータは正常に完了します。

すべてがクリアになる。通常の削除は免責とさせていただきました。

端末が閉じると大変なことになる。3秒以内とする。

また、ドキュメントに書くかどうかですが、1.このような無茶な指標を書くことを甘受しないため(確認のために書いたのか)2.緩むと同時に、締まる。

 
Alexandre:

Internal Compiler Error(インジケータで使用される関数)のおかしな原因。

...

治療法は明白だが、同意する - 非常に面白い不具合。:)))

投稿ありがとうございました

プライベート メッセージを書きました。
 
こんにちは。前のポジションが開かれた後、n本目のバーで ポジションを開くようなコードがどうにも書けないのです。Time[i]、iBarShift、iTimeを使用してみました。全てにおいて運がなかった。私はプログラミングの初心者です。検索しても何も出てこない。
 

Dmitri Custurov:
Здравствуйте. Не получается написать код, который открывал бы позицию через n-количество баров после открытия предыдущей позиции. Пробовал использовать Time[i], iBarShift, iTime. Все безуспешно. В программировании новичок. Поиск ничего не дал.

ご挨拶、エラーを見つけるためのヘルプを得るためには、少なくともコードを添付する必要があります。ここでは誰もあなたの代わりに書いてはくれません。ここでは、あなたが間違いを発見し、アドバイスを受けて修正するのが通例です。または - フリーランサーに連絡する。
 

以下はそのコードです。

if ((オーダーセレクト(0,SELECT_BY_POS,MODE_TRADES) ==False)&&(Signal==1)))
{int send1=OrderSend(Symbol(), OP_SELL, Volume_, Bid, 0, 0, NULL, 1, 0, Red)とする。
z=1;

Timer=Time[0];}。

TimerNull=iBarShift(NULL,0,Timer,false)です。

if ((TimerNull>=n)&&(z==1))

{int send2=OrderSend(Symbol(), OP_SELL, Volume_, Bid, 0, 0, NULL, 2, 0, Red)とする。

z=2;}

こんな方法も試してみました。

if ((オーダーセレクト(0,SELECT_BY_POS,MODE_TRADES) ==False)&&(Signal==1)))
{int send1=OrderSend(Symbol(), OP_SELL, Volume_, Bid, 0, 0, NULL, 1, 0, Red)とする。
z=1;

Timer=Time[0];}。

TimerNull=Time[0]です。

if ((TimerNull>=(Timer+2700))&&(z==1))//ここでは例として、nの代わりに2700秒を置き、テストでは15分ローソク足3本を意味します) {int send2=OrderSend(Symbol(), OP_SELL, Volume_, Bid, 0, 0, NULL, 2, 0, Red)。

z=2;}

そしてまた、このように。

if ((オーダーセレクト(0,SELECT_BY_POS,MODE_TRADES) ==False)&&(Signal==1)))
{int send1=OrderSend(Symbol(), OP_SELL, Volume_, Bid, 0, 0, NULL, 1, 0, Red)とする。
z=1;

Timer=Time[0];}。

TimerNull=Time[0]です。

if ((CurrentTime()>=(Timer+2700))&&(z==1))

{int send2=OrderSend(Symbol(), OP_SELL, Volume_, Bid, 0, 0, NULL, 2, 0, Red); //この場合、2700を削除すると、同じバーで最初の取引の直後に2番目の取引が開始されましたが、これは理に適っています。そして、2700ではなく600まで任意の値を入れても、同じバーで2つ目のディールが開かれてしまいました。600より高い値では、2番目の取引は開かれませんでした。何が問題なのか理解できない。是非ともご協力をお願いします。

Timer および TimerNull パラメータは datetime フォーマットである。


 

この例では、位置の列挙がありません。

if ((オーダーセレクト(0,SELECT_BY_POS,MODE_TRADES) ==False)&&(Signal==1)))

そのため、常にポジション0が選択されます。

 
基本的なロジックを実現するために、今もラフを書き続けています。その後、改良を加えていきます。この場合、私の勘違いかもしれませんが、問題はコードの2番目の部分にあります。
 
Slawa:

すべてに意味がある。正常な削除のための免罪符を作った。

端末を閉じると、硬くなります。3秒以内とする。

また、ドキュメントに書くかどうかですが、1.このような無茶な指標を書くことを甘受しないため(確認のために書いたのか)2.緩めたように、締めたように。

だからもう引き締めるか、リファレンスを直せ。耽溺しない耽溺は、真面目な話ではない。プログラマーがあなたに期待するのは「甘やかし」ではなく、明確できちんとしたドキュメントを持ったソフトウェアです。

もちろんこのコードには、あなた自身が求めたデモ以外の目的はありません。また、Sleepが削除 され、CommentがPrintに置き換われば、無害であることは明らかです。QuartetとQuartet 5のいずれにおいても、ログにギガバイトのPrintをスパムすることに対する保護はありません。

 
Dmitri Custurov:

以下はそのコードです。

if ((オーダーセレクト(0,SELECT_BY_POS,MODE_TRADES) ==False)&&(Signal==1)))
{int send1=OrderSend(Symbol(), OP_SELL, Volume_, Bid, 0, 0, NULL, 1, 0, Red)とする。
z=1;

Timer=Time[0];}。

TimerNull=iBarShift(NULL,0,Timer,false)です。

if ((TimerNull>=n)&&(z==1))

{int send2=OrderSend(Symbol(), OP_SELL, Volume_, Bid, 0, 0, NULL, 2, 0, Red)とする。

z=2;}

こんな方法も試してみました。

if ((オーダーセレクト(0,SELECT_BY_POS,MODE_TRADES) ==False)&&(Signal==1)))
{int send1=OrderSend(Symbol(), OP_SELL, Volume_, Bid, 0, 0, NULL, 1, 0, Red)とする。
z=1;

Timer=Time[0];}。

TimerNull=Time[0]です。

if ((TimerNull>=(Timer+2700))&&(z==1))//ここでは例として、nの代わりに2700秒を置き、テストでは15分ローソク足3本を意味します) {int send2=OrderSend(Symbol(), OP_SELL, Volume_, Bid, 0, 0, NULL, 2, 0, Red)。

z=2;}

そしてまた、このように。

if ((オーダーセレクト(0,SELECT_BY_POS,MODE_TRADES) ==False)&&(Signal==1)))
{int send1=OrderSend(Symbol(), OP_SELL, Volume_, Bid, 0, 0, NULL, 1, 0, Red)とする。
z=1;

Timer=Time[0];}。

TimerNull=Time[0]です。

if ((CurrentTime()>=(Timer+2700))&&(z==1))

{int send2=OrderSend(Symbol(), OP_SELL, Volume_, Bid, 0, 0, NULL, 2, 0, Red); //この場合、2700を削除すると、同じバーで最初の取引の直後に2番目の取引が開始されましたが、これは理に適っています。そして、2700ではなく600まで任意の値を入れても、同じバーで2つ目のディールが開かれてしまいました。600より高い値では、2番目の取引は開かれませんでした。何が問題なのか理解できない。是非ともご協力をお願いします。

Timer および TimerNull パラメータは datetime フォーマットである。


このEAは、指定された数のバーの 後に注文を開く必要があります。そして、EAコードを正しく挿入する方法、メッセージバーのSRCボタンについて学びます。

//+------------------------------------------------------------------+
//|                                                          111.mq4 |
//|                        Copyright 2016, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2016, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property strict

input int nymber_bar=10;
input double Volume_=0.01;
int send1;
int send2;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---

//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---

  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//---
   if(Total_orders(_Symbol,OP_SELL)==0 && send1<=0)
     {
      send1=OrderSend(Symbol(),OP_SELL,Volume_,Bid,0,0,0,NULL,1,0,Red);
     }

   if(OrderSelect(send1,SELECT_BY_TICKET))
     {
      if(iBarShift(NULL,0,OrderOpenTime())>=nymber_bar)
        {
         send1=OrderSend(Symbol(),OP_SELL,Volume_,Bid,0,0,0,NULL,1,0,Red);
        }
     }

  }
//+------------------------------------------------------------------+
int Total_orders(string symbol,int type)
  {
   int n=0;
   int total=OrdersTotal();

   for(int i=0; i<total; i++)
     {
      if(OrderSelect(i,SELECT_BY_POS))
        {
         if(OrderType()!=type)continue;
         //if(OrderMagicNumber()!=Magic)continue;
         if(OrderSymbol()!=symbol)continue;
         n++;
        }
     }
   return(n);
  }
//+------------------------------------------------------------------+

111

 

この質問は、おそらくウェブサイト開発者またはフリーランスサービス管理者向けです。

---

以前は:568件の仕事が完了、75%が個人的な仕事

13個のジョブを追加(すべて個人的なもの)し、次のようになりました:完了581個、個人的なもの75%。

---

そこで質問ですが、75%とはどういう意味ですか?