[警告は閉鎖されました!】フォーラムを乱雑にしないために、どんな初心者の質問でも。プロフェッショナルは、通り過ぎないでください。あなたなしでは、どこにも行けない。 - ページ 774

 
drknn:

私は成行注文を開くの行を持っているのか理解できません。私はそれをコピーして、注文に新しいものを追加しますが、同じ4107エラーはログに表示されませんが、注文は開く、あなたは私が逃したものを見るために気にすれば

ファイル:
test_21_1.mq4  15 kb
 
FoxUA:

私はそれがわからない、私は成行注文のオープニングでこの行を持っている、私は保留中の順序にそれをコピーして、新しいものを追加しますが、同じ4107エラーがログに書き込まれたまま、保留中の順序は、私が逃したものを見て気にすれば、置かれます。


コードの整理がくそ下手なんだろ。また、変数名には略語が使われていて、これも読みにくいですね。

コードはブロック単位で構成すること。一目で何のコードかわかるように、変数に名前をつける。定数名(習慣化する)大文字で書く。定数を値で初期化する場合は、初期化ブロックに入れる必要があります。だから、例えば、絶対に正当化されない文字列の使用がある

文字列 sy = Symbol();

をEA開始時に設定します。では、なぜ毎ティックごとにSymbol()関数を呼び 出す必要があるのでしょうか?トレード中、シンボル名は同じままなのに?初期化ブロックの中で変数syの値で一回初期化すれば十分です。さらに、このコードブロック

pral=StopLossLastPos(sy,OP_BUY,-1) ;   // цена по StopLoss последнего открытого BUY на покупку BUYLIMIT
pras=TakeProfitLastPos(sy,OP_BUY,-1);  // цена по TakeProfit последнего открытого BUY на покупку BUYSTOP
prbl=StopLossLastPos(sy,OP_SELL,-1);   // цена по StopLoss последнего открытого SELL на продажу SELLLIMIT
prbs=TakeProfitLastPos(sy,OP_SELL,-1) ;// цена по TakeProfit последнего открытого SELL на продажу SELLSTOP

根本的に間違っている!最後の注文のストップロスを知るには、まずその注文をOrderSelect()で選択する必要があります - 下記の注文カウンターの例をご覧ください。つまり、最後の注文にストップレベルが必要な場合は、ループを介してこれを行う必要があります。次のページのデザインです。

int total = OrdersTotal();
if(total == 0){

}

は正当化されない。関数OrdersTotal() は、端末で既に開いている注文の総数を返します。この値には、他の取引商品から発注された注文や、Expert Advisor が発注した注文ではなく、お客様が手動で同じ商品に対して発注した注文も含まれます。

手持ちのトレードをせず、EAを投げたシンボルだけをトレードするのであれば、このデザインは有効でしょう。しかし、自分の手で取引したい、EAがマニュアル取引の邪魔にならないようにしたい、あるいは他のシンボルでも取引を実行させたいと思った途端、このデザインは本当にがっかりさせることになります。だから、注文の種類ごとに別々の注文カウンターを書いた方がいい。そんなカウンターの一例をご紹介します。

//=========== SchBuy()  ===============================
//  Функция возвращает количество Buy-ордеров
//   SchBuy      - счётчик Buy ордеров
//-----------------------------------------------------------
int SchBuy(int MAGIC){
  string SMB=Symbol();
  int SchBuy=0;
  for (int i=OrdersTotal()-1;i>=0;i--) {
    if (!OrderSelect(i, SELECT_BY_POS, MODE_TRADES)){
      Print("Ошибка № ",GetLastError()," при выборе ордера № ",i);
    }
    else {
      if(OrderSymbol()!= SMB || OrderMagicNumber()!= MAGIC){continue;}// если не наш, то смотрим следующий
      if(OrderType()==OP_BUY){ 
        SchBuy++;
      }  
    }
  }
  return(SchBuy);
}                  

上記の推奨事項を考慮してコードを書き換えてください!

 

のような文字列があることに気がつかなかったので、すみません。

pral=StopLossLastPos(sy,OP_BUY,-1) ;   // цена по StopLoss последнего открытого BUY на покупку BUYLIMIT

サブプログラムを呼び出す。

でも、やはり違う方法で整理したほうがいい。

>> double StopLossLastPos(string sy="", int op=-1, int mn=-1) { .

サブプログラムに取引記号のシンボル名を渡す必要はありません。サブルーチンはExpert Advisorにあり、付属のライブラリにはありません。変数syはExpert Advisorのグローバルレベルで宣言されているので、この変数はそのようなサブプログラムのスコープ内にあります。さらに、第2パラメータをサブプログラムに渡しますが、サブプログラム自体を呼び出すときに、このパラメータを値で初期化します(int op=-1)-これは必要ないでしょう。次のパラメータも同様です。

ライン

>> if (op<0 || OrderType()==op) {.

はまた読めません。私のカウンターの中の整理整頓をご覧ください。

 

そして、これです。コードブロック

pral=StopLossLastPos(sy,OP_BUY,-1) ;   // цена по StopLoss последнего открытого BUY на покупку BUYLIMIT
pras=TakeProfitLastPos(sy,OP_BUY,-1);  // цена по TakeProfit последнего открытого BUY на покупку BUYSTOP
prbl=StopLossLastPos(sy,OP_SELL,-1);   // цена по StopLoss последнего открытого SELL на продажу SELLLIMIT
prbs=TakeProfitLastPos(sy,OP_SELL,-1) ;// цена по TakeProfit последнего открытого SELL на продажу SELLSTOP

がtick毎に呼び出されます。しかし、すべてのティックに必要なわけではありません。場合によってはストップ/プロフィットオーダーを 知るだけでよいのです。このとき、サブルーチンを呼び出す必要があります。

 
spidey:

こんにちは、インジケータにアラート(緑のものが赤いものを上から下へ交差させる-売り、戻る-買い)を付けることは可能ですか?

また、誰かが盗んだコードをフォーラムに投稿しています。:))))))))

こんな数字の羅列のような変数の寄せ集めを、無料で掘り下げたい人がいるとは思えませんね :)

 
spidey:

こんにちは、ターキーにアラートを追加していただけませんか(緑のものが上から下へ赤いものを横切る-売り、戻る-買い)。

もしまた同じことをしたら、私はあなたをゲームから追放せざるを得なくなるでしょう。

これはフォーラムのルール違反です。

 
は、コードを掲載する必要があるのでしょうか?
 
drknn:

のような文字列があることに気がつかなかったので、すみません。

サブプログラムを呼び出す。

でも、やはり違う方法で整理したほうがいい。

>> double StopLossLastPos(string sy="", int op=-1, int mn=-1) { .

サブプログラムに取引記号のシンボル名を渡す必要はありません。サブルーチンはExpert Advisorにあり、付属のライブラリにはありません。変数syはExpert Advisorのグローバルレベルで宣言されているので、この変数はそのようなサブプログラムのスコープ内にあります。さらに、第2パラメータをサブプログラムに渡しますが、サブプログラム自体を呼び出すときに、このパラメータを値で初期化します(int op=-1)-これは必要ないでしょう。次のパラメータも同様です。

ライン

>> if (op<0 || OrderType()==op) {.

はまた読めません。見てください!私のカウンターの中で整理されています。

ということは、関数呼び出しは 単純に書けばいいのでしょう。

PrAskLim = StopLossLastPos(OP_SELL); 関数自体で。

double StopLossLastPos(int op=-1,)こんな感じ?

私はすでにこのサイトから関数を取ったことを言った、私はより読みやすいものに彼らの変数を変更する勇気がないので、彼らの仕事はテストされている、私はあなたができることとあなたが変更できないことについての経験が不足しているかもしれないので、これは、私が作業関数の間違った何かを変更するかもしれないという危険をはらんでいるとあなたは再びコードの山に針を刺すでしょう。

が、自分で追加したものはできる限り修正しました。

すでに自分で追加しましたが、ログ4107の問題は解決されず、保留中の注文の機能で根本的に何も変更していないので、価格とストップを変更する方法をお聞きしたいのです。

第二の問題は、この価格にスプレッドを追加する方法です。 PrAskLim = StopLossLastPos(OP_SELL) ; (Spread =MarketInfo(sy, MODE_SPREAD); )

以下は、修正版のEAです。

ファイル:
test_21_2.mq4  16 kb
 
spidey:
は、コードを掲載する必要があるのでしょうか?
盗まれたものは載せなくていい。
 
drknn:
盗んだものを投稿する必要はない。

盗む必要はない。

そして、このリソースのルールはそれを禁止していない...。

https://www.mql5.com/ru/code/8089

;)