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

 
a196012a:

ボリューム0.1の注文を出すブロック(void start()関数の直後)を使って、あなたのコードを完成させました。

しかし、なぜかプログラムは、これらの注文の閉鎖に応じて増加した量(各0.3ロット)の任意の順序を開くことはありません。

あなたのコードで私が理解できないこと

1.私の理解が正しければ、МН=123は0.3ロットの出来高の注文にのみ割り当てられていますね。

datetime関数SearTim (int s)で、MH=123で出来高が0.1の注文を探していますね。

しかし、出来高0.1の注文はМН=123とすることはできません。なぜなら、このMMは出来高0.1の注文にのみ割り当てられるからです

datetime SearTim(int s) と int sear() 関数の本体、特にコメントでは、出来高0.3の注文を出すのに必要な

なぜ、同じ条件でより大きな数量の注文を何度も出さなければならないのか理解できない。

すでに1ブロック目で出来高を増やした注文を開いていますね。



0.1の注文をそれぞれ決済した後、0.3の出来高の注文をオープンし、0.1の値を維持するようなコードを書いていただけるとありがたいのですが、いかがでしょうか?

この場合、Print()関数と 私のささやかな知識、参考書の助けを借りて、あなたのコードから私の疑問に対するすべての答えを見つけるためにベストを尽くします。

0.1巻と0.3巻の同じタイプの注文があるのですが、SELだけです。そのため、私の勘違いでなければ、int sear()関数で注文の種類(BAYかSELか)を計算する必要はないのです。

私のプログラムの最終目標は、0.1注文がSLで決済された0.3注文によってその終値で決済された後のオープニングの時間値(分でも秒でもなく時間だけ)を記憶することであることを、もう一度思い出していただきたい。


プログラミング言語を知っていることが前提なので、あまり説明できないのが申し訳ないのですが。もうプログラマーだと思うので、プログラミングを知っている人を頼っていたんです。

まずプログラミングを学ばなければならない。何をどのようにと説明すると、それはプログラミング言語の習得になります。

EAの例、書き方を見て、一からプログラムを書いてみる。しかも、すでに複雑になっているプログラムを書こうとしているわけですから。

チュートリアルやコマンドの書き方の例、サンプルモジュールを見てください。

ファイル:
MQL4.zip  2226 kb
 

この素朴な疑問を解決する、クロージングブロックをご紹介します。

注文の利益がプラスになると、その注文を決済し、その利益全体で、どれだけの負けポジションが可能かを判断します。Perekrが有効な場合。


儲かるポジションの利益が負けるポジションの損失をすべてカバーしたときのみ、つまり一方の注文の利益が他方の注文の損失と同じかそれ以上になったときに、両方のポジションを閉じるように変更する必要があるのです。

if(Mas_Tip[1]>0)

     {

      if(Bidt-step*Point>=NormalizeDouble(Bid,Digits))

        {

         Profit=AccountBalance()-StartProfit;

         Askt=NormalizeDouble(Ask,Digits);

         Bidt=NormalizeDouble(Bid,Digits);

         for(int i=1; i<=OrdersTotal(); i++)

           {

            if(OrderSelect(i-1,SELECT_BY_POS)==true && OrderType()==OP_SELL && 

               OrderSymbol()==Symbol() && OrderMagicNumber()==Magic)

              {

               if(Razn<2)

                 {


                  if(Perekr && OrderProfit()>0 && max_lot>=Lots_per) //перекрытие

                    {

                     double profit=OrderProfit();

                     Print("закрываю по перекрытию");


                     ClosePosBySelect(OrderLots());

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

                       {

                        if(OrderSelect(f,SELECT_BY_POS)==true && OrderType()==OP_BUY && 

                           OrderSymbol()==Symbol() && OrderMagicNumber()==Magic)

                          {

                           if(OrderProfit()<0)

                             {

                              if(profit>=MathAbs(OrderProfit()))

                                {

                                 Print("закрываю по перекрытию");


                                 ClosePosBySelect(OrderLots());

                                }

 

友よ、こんにちは。初心者に教えてほしいのですが

ある指標と価格のクロスオーバーをメールで通知してほしいのですが。やり方は理解できたのですが、クロスした途端に何百通ものメールが届き、今のローソクが閉まるまで無限に送り続けられるのです。メッセージを1つだけ送信するにはどうしたらよいですか?以下はその一例です。

if((iSAR(NULL, 0,Step,Maximum, 1)<iClose(NULL,0,1))&(iSAR(NULL, 0,Step,Maximum, 2)>iClose(NULL,0,2))) ){ (iSAR(NULL, 0,Step,Maximum, 2))&(iSAR(NULL,0,1))> iClose(NULL,0,2)))

bool res = SendMail("Buy Signal", "Buy Signal");

}


if((iSAR(NULL, 0,Step,Maximum, 1)>iClose(NULL,0,1))&(iSAR(NULL, 0,Step,Maximum, 2)<iClose(NULL,0,2)))) { { (iSAR(NULL, 0,Step,Maximum, 2))&iClose(NULL,0,2))

SendMail("売りシグナル", "売りシグナル");

}

 
ev85:

友よ、こんにちは。初心者に教えてほしいのですが

ある指標と価格のクロスオーバーをメールで通知してほしいのですが。やり方は理解できたのですが、プライスクロスが起きるとすぐに何百通ものメールが届き、現在のローソク足が閉じるまで無限に送り続けられるのです。メッセージを1つだけ送信するにはどうしたらよいですか?以下はその一例です。

if((iSAR(NULL, 0,Step,Maximum, 1)<iClose(NULL,0,1))&(iSAR(NULL, 0,Step,Maximum, 2)>iClose(NULL,0,2))) ){。

bool res = SendMail("Buy Signal", "Buy Signal");

}


if((iSAR(NULL, 0,Step,Maximum, 1)>iClose(NULL,0,1))&(iSAR(NULL, 0,Step,Maximum, 2)<iClose(NULL,0,2)))) { { (iSAR(NULL, 0,Step,Maximum, 2))&(iSAR(NULL,0,1))>iClose(NULL,0,2))

SendMail("売りシグナル", "売りシグナル");

}

パラボリックの場合は、条件にフラグを入れるだけなので簡単です。あるいは、int型の 単純な変数で、信号ごとに値が変化するもの。

static bool flag;
 if(flag && iSAR(NULL, 0,Step,Maximum, 1) < iClose(NULL,0,1) && iSAR(NULL, 0,Step,Maximum, 2) > iClose(NULL,0,2)){

 bool res = SendMail("Сигнал на покупку",  "Сигнал на покупку");
 flag = false;
 }


 if(!flag && iSAR(NULL, 0,Step,Maximum, 1) > iClose(NULL,0,1) && iSAR(NULL, 0,Step,Maximum, 2) < iClose(NULL,0,2)){

 SendMail("Сигнал на продаж",  "Сигнал на продажу");
 flag = true;
 }
 

皆さんこんにちは、Trailing Stopについて教えてください。トレーリングストップは、最初はSL=100で、ポジションが30pips上にあるときに発動させるという条件で書きました。しかし、ポジションを開いた直後に修正し、標準のSLを30に変更し、移動します。

void Trailing()

{

int SLoss = 1;

double StopL = NormalizeDouble (OrderOpenPrice() + SLoss*Point, Digits);

Double StopL2 = NormalizeDouble (OrderOpenPrice() - SLoss*Point, Digits);

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

{

if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES))

{

if (OrderSymbol() == Symbol() && OrderMagicNumber() == Magic)

{

if (OrderType() == OP_BUY && OrderStopLoss() >= StopL)

{

if (ビッド-ストップL > トレイリングストップ*ポイント)

{

if (OrderStopLoss() < Bid-(TrailingStop+TrailingStep)*Point)

{

if(!OrderModify(OrderTicket(), OrderOpenPrice(), NormalizeDouble(Bid-TrailingStop*Point, Digits), 0, 0))

Print(" Ordermodification error!");

}

}

}

if (OrderType() == OP_SELL && OrderStopLoss() <= StopL2)

{

if (StopL2 - Ask > TrailingStop*Point)

{

if (OrderStopLoss() > Ask+(TrailingStop+TrailingStep)*Point)

{

if(!OrderModify(OrderTicket(), OrderOpenPrice(), NormalizeDouble(Ask+TrailingStop*Point, Digits), 0, 0))

Print("Order modification error!");

}

}

}

}

}

}

}

 
Alexey Viktorov:

パラボリックの場合は、条件にフラグを入れるだけなので簡単です。あるいは、int型の 単純な変数で、信号ごとに値が変化するもの。

そうでなければ、最初のシグナルの後、スタティック変数は真のままです。
 
AlGuru:

皆さんこんにちは、Trailing Stopについて教えてください。トレーリングストップは、最初はSL=100で、ポジションが30pips上にあるときに発動させるという条件で書きました。オープンポジションの直後に修正し、標準のSLを30に変更してから移動させます。

...
どのように役立つ のでしょうか?そこにテンプレートを掲載しましたので、それを元に自分で好きなものを作ってください。
 
Artyom Trishkin:
そうでなければ、最初のシグナルの後、スタティック変数はtrueのままです。

なんでジェルザが入ってるんだ?flag == true;またはflag == false;だと思うのですが、これはコードにある

if(flag && ****

if(! flag && ****

片側に交差点があれば、もう片側に交差点があるのを待つ...。そうして、ループは閉じられる。しかし、最初にどうすれば正しく接続できるかは、本人に考えさせよう。あるいは後で聞くか...。

 
Alexey Viktorov:

なんでジェルザが入ってるんだ?flag == true;またはflag == false;だと思うのですが、これはコードにある

片側に渡るときは、反対側への渡りを待つ...。...といった具合に、サイクルが終了します。しかし、最初の起動時にどのように正しく接続するかは、本人に考えさせよう。あるいは後で聞くか...。

一方向の異なるバー上に2つの信号がある場合?

スイングしかないんですね。

しかし、シグナルは常にシグナルがあるときに送るべきですが、シグナルを送るかどうかの判断は別にします。

各方向ごとにフラグを持ち、それを切り替えるのが最適だと思われます。しかし、一方向の信号が反対方向の信号に依存するようなことはありません。

 
Artyom Trishkin:

2つのシグナルが同じ方向の異なるバー上にある場合?

一振りしかできない。

しかし、シグナルは常にシグナルがあるときに送るべきですが、シグナルを送るかどうかの判断は別にします。

各方向ごとにフラグを持ち、それを切り替えるのが最適だと思われます。しかし、一方向の信号が反対方向の信号に依存するようなことはありません。

アルテム、私はあなたへの返事を次のような言葉で始めた。

パラボリックは厳格な交替制をとっており、一方向に2つのシグナルを出すことは、たとえ異なるバーであっても、不可能である。しかも、そのために何かを工夫する必要は全くなく、MAのようなゼロバーでもガタつかないのです。