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

 
wishmast:

みんな、もう頭を悩ませているんだ。高値と安値、例えば8本のローソク足で、1/4の利食いでEAに保留注文を出させるにはどうしたらいいのでしょうか。

こんな感じでやってます。

double Vhod1=iHighest(Symbol(),0,MODE_HIGH,8,0);

double Vhod2=iLowest(Symbol(),0,MODE_LOW,8,0);

double TP=((Vhod1-Vhod2)/4)+Vhod1;


パラメータを変更しようとしたが、間違ったストップが表示されたり、価格が7.00000に設定されたりして、どこから来ているのか不明である。

iHighest、iLowestはローソク足のアドレスは出ますが、価格は出ません。
 
evillive:
iHighest, iLowestでは、価格ではなく、キャンドルの住所が表示されます。

そうなんです。必要なのは

double Vhod1=iHigh(Symbol(), 0,iHighest(Symbol(),0,MODE_HIGH,8,0)) となります。

double Vhod2=iLow(Symbol(), 0, iLowest(Symbol(),0,MODE_LOW,8,0)) となります。

 
alvlaf:


入れ方を間違えたが、それでも正常に動作しなかったのは......。なぜなら)とにかく、こんな感じでいいんです。

1) IniteにAllowNewOrders変数を作成する(存在しない場合)

2) 新規注文を作成し、それが閉じるまで、このシンボルの OnTick はアイドルですが、他のシンボルの OnTick は実行されます。

3) MaxOpenOrdersの上限に達するまで、他のシンボルに対してステップ2を実行します。

4) 注文が終了したとき、それが負けているか価値がゼロであれば、AllowNewOrdersを通じてすべてのコピーの新規注文を開くことを禁止する。

[ここが当面の問題です。負け続けているシリーズが終了するとAllowNewOrders=1になりますが、MaxOpenOrders>1でこのセッションが複数ある場合はどうでしょうか] 。

5) ポイント4が満たされない場合、新規注文を行うことができます。

MaxOpenOrders=1 のとき、プログラムは動作しなければならない(MUST)。おそらく、採算の取れない注文の後に新規注文を禁止した場合 AllowNewOrders=0で、次のOrderSendで 何らかの理由で注文が開かれないという問題が発生すると思われます。以下に、この場合のヘッジ方法を書きますが・・・。

int OnInit()                     
{
   if (!GlobalVariableCheck("AllowNewOrders")) GlobalVariableSet("AllowNewOrders", 1);
   return(INIT_SUCCEEDED);
}
//----------------------------------------------------------------------
void OnTick()
{
   if (CountTrades() == 0)  // Количество ордеров должно равняться нулю
   {
      if ((TypeLastHistOrder() == OP_BUY && PriceCloseLastHistOrder(OP_BUY) < PriceOpenLastHistOrder(OP_BUY))
      || (TypeLastHistOrder() == OP_SELL && PriceCloseLastHistOrder(OP_SELL) > PriceOpenLastHistOrder(OP_SELL)))
      // Если последняя сделка убыточная, то открывается такая же, но с увеличенным лотом
      {
         GlobalVariableSet("AllowNewOrders", 0);
         Type = TypeLastHistOrder();
         if (Type == OP_BUY)  Price = Ask;
         if (Type == OP_SELL) Price = Bid;
         Lot = NormalizeDouble(LotsLastHistOrder()*Multiplier, 2);
         ticket = OrderSend(Symbol(), Type, Lot, Price, Slippage, 0, 0, IntegerToString(Exp), Magic);
      }
      else GlobalVariableSet("AllowNewOrders", 1);
      if (PriceCloseLastHistOrder() == PriceOpenLastHistOrder() && CountHistTrades() > 0) 
      // Если прибыль последней сделки равняется нулю, то открывается такая же
      {
         GlobalVariableSet("AllowNewOrders", 0);
         Type = TypeLastHistOrder();
         if (Type == OP_BUY)  Price = Ask;
         if (Type == OP_SELL) Price = Bid;
         Lot = NormalizeDouble(LotsLastHistOrder(), 2);
         ticket = OrderSend(Symbol(), Type, Lot, Price, Slippage, 0, 0, IntegerToString(Exp), Magic);
      }
      else GlobalVariableSet("AllowNewOrders", 1);
      if (((TypeLastHistOrder() == OP_BUY && PriceCloseLastHistOrder(OP_BUY) > PriceOpenLastHistOrder(OP_BUY))
      || (TypeLastHistOrder() == OP_SELL && PriceCloseLastHistOrder(OP_SELL) < PriceOpenLastHistOrder(OP_SELL)))
      || CountHistTrades() == 0)
      // Если последняя сделка прибыльная или это первая сделка, то открывается ордер
      {
         if (OrdersTotal() >= MaxOpenOrders || GlobalVariableGet("AllowNewOrders") == 0) return;
         if (SignalBuy())
         {
            ticket = OrderSend(Symbol(), OP_BUY, Lots, Ask, Slippage, 0, 0, IntegerToString(Exp), Magic);
         }
         if (SignalSell())
         {
            ticket = OrderSend(Symbol(), OP_SELL, Lots, Bid, Slippage, 0, 0, IntegerToString(Exp), Magic);
         }
      }
   }
}
 
A13ksandr:

このような事態を想定して、私がどのようにヘッジしているかを以下に書いてみます...。

int Tries = 5;
ResetLastError();
do
{
   // решение ошибок с предыдущей попытки открытия ордера, например:
   if (_Error == 134)
   {
      _Lot = NormalizeDouble(_Lot / 2, 2);
      if (_Lot < SymbolInfoDouble(Symbol(), SYMBOL_VOLUME_MIN)) _Lot = SymbolInfoDouble(Symbol(), SYMBOL_VOLUME_MIN);
   }
   if (_Error == 138) RefreshRates();
   Ticket = OrderSend(Symbol(), OP_BUY, _Lot, Ask, 3, 0, 0, NULL, 0, 0, clrNONE);
   if (Ticket < 0)
   {
      _Error = GetLastError();
      Sleep(100);
   }
   Tries--;
}
while (Ticket < 0 && Tries > 0);

エラーの解決策を適切に予見できれば、注文開始の成功率は高まります。

 
こんにちは!私はポストから関数を使用する場合、私に助言してください(各注文は、独自のマジシャンを持っている) - http://forum.forexpeoples.ru/showthr...=1#post1715092 、どのように販売または購入のための最後の注文を見つけるか、注文のシリーズをアップグレードするように見えるだろう、各注文は、独自のマジシャンが、注文の各シリーズを持っていない場合は、それ自身のマジシャンを持っています。すなわち、独自のマジックを持つ新しい一連のオーダーが開かれたとき、古い一連のオーダーは独自のマジックを持つ独自のオーダーを開き続けることが前提となっています。シリーズごとに利益が見込まれ、そのようなシリーズの注文が多くあります。

このような条件下で、下記のコードはどのように変化するのでしょうか?
for(cnt=OrdersTotal()-1;cnt>=0;cnt--){
if (!OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES)) continue;
if(OrderSymbol()!=Symbol()) continue; if(OrderMagicNumber() < startMagicNumber || OrderMagicNumber() >= startMagicNumber + MaxTrades) continue;

シリーズの最初の注文を開くときにmagikを生成するコードを配置しましたが、同じシリーズの新しい注文を開くときに問題があります。

投稿からマジックを生成するコードそのもの
//+------------------------------------------------------------------------+
// シリーズの次のマジックを取得
int getNextMagicNumber(){
int magic = EMPTY;

if (OrdersTotal() == 0) {
return(startMagicNumber);
} とします。

for (int i = startMagicNumber; i < startMagicNumber + MaxTrades; i++){
magic = checkMarketByMagic(i);
if (magic != EMPTY) break;
} (int=startMagicNumber)、(i=magicNumber + MaxTrades; i++)、(i=startMagicNumber + MaxTrades; i++)。

if (magic == EMPTY){
magic = startMagicNumber; // シリーズの最初
} else {
magic++; // シリーズの次
}

return(magic);
}
//+----------------------------------------------------------------+
// keekkenen: 与えられたマジックでマーケットでの注文をチェックする
int checkMarketByMagic(int magic){
for(int i = 0; i < OrdersTotal(); i++){
if(!OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) continue;
if(OrderSymbol() != Symbol()) continue;
if(OrderMagicNumber() == magic) return(magic);
}
return(EMPTY);
} (注)1.オーダー番号とは、オーダー番号のことです。
//+------------------------------------------------------------------+
 
フォーラムの良い午後紳士、
私はスレッドを混乱させる場合は申し訳ありませんが、私はテーマを投稿する正しい場所を発見していないので、私を蹴らないでください。

時々、新しいExpert Advisorをネットサーフィンしていると、その説明は標準的で、たくさんあるのに、その名前に注意を払わなかったものに出会うことがあります。

気づかなければ、その名前を聞き逃していたかもしれません。もしかしたら、同じような動作をするEAがあるかもしれません。

Expert Advisorの意味を説明します(今必要なのは、非常に高度なものはありません)。

大雑把に言うと、次のような仕事です。

1.買いなどのポジションを 手動で建てる
2.Expert Advisor は設定に従って Stop Loss と Take Profit を設定します。
3.注文はテイクプロフィットで決済されます。EAはすぐに別の買いを開き、最初のストップロスをキャッチするまで、または究極のテイクプロフィットがある場合、同じストップロスとテイクプロフィットを設定します。
4.ストップロスでポジションが閉じられた場合、ロボットはそれ以上何もしません。Expert Advisor は、次の注文が手動で開かれるのを待ちます。

以上です。

とてもありがたいことです。
 
A13ksandr:


間違えて挿入してしまったのですが、それでも正常に動作しません、なぜなら...。なぜなら)とにかく、こんな感じです。

1) initemにAllowNewOrders変数を作成する(存在しない場合)

2) このシンボルの OnTick はアイドル状態だが、他のシンボルの OnTick は機能する、閉じるまで新しい注文を作成する

3) MaxOpenOrdersの上限に達するまで、他のシンボルに対してステップ2を実行します。

4) 注文が終了したとき、それが負けているか価値がゼロであれば、AllowNewOrdersを通じてすべてのコピーの新規注文を開くことを禁止する。

[ここが当面の問題です。負け続けているシリーズが終了するとAllowNewOrders=1になりますが、MaxOpenOrders>1でこのセッションが複数ある場合はどうでしょうか] 。

5) ポイント4が満たされない場合、新規注文を行うことができます。

MaxOpenOrders=1 のとき、プログラムは動作しなければならない(MUST)。おそらく、採算の取れない注文の後に新規注文を禁止した場合 AllowNewOrders=0で、次のOrderSendで何らかの理由で注文が開かれないという問題が発生すると思われます。この場合、どのようにヘッジしているのか、以下に書きます。

Alexanderさん、ありがとうございます!明日確認してみます。[したがって、問題はすぐに - 負けたシリーズが終了すると、AllowNewOrders=1、およびMaxOpenOrders>1、いくつかのセッションがある場合?] 。MaxOpenOrders>1であれば、AllowNewOrders=1も同じ値で大きくなるはずです。しかし、このバージョンではとにかく1つ以上のシリーズは計画されていないため、わざわざこれを行う必要はなく、MaxOpenOrdersは全く削除されるべきです。
 
alvlaf:
Alexanderさん、ありがとうございます!明日確認してみます。[負けたシリーズが終了すると、AllowNewOrders=1になりますが、MaxOpenOrders>1で複数のセッションがある場合はどうなるのでしょうか?]MaxOpenOrders>1であれば、AllowNewOrders=1も同じ値で大きくなるはずです。しかし、今のところそれを気にする必要はありませんし、このバージョンのプログラムではとにかく1つ以上のシリーズは予定されていないので、MaxOpenOrdersは完全に省略されるべきです。
試してみたところ、最初の5分間はうまくいったのですが、その後、一度に複数の取引(4件)を開くようになり、同じペアでロットが大きくなってしまいました。Alexanderさん、あなたのバージョンでは、グローバル変数が どのように値を取得し、変更するのかがよくわからないのですが?
 

皆さん、こんにちは。

ここでは、グラフ上のオブジェクトを紹介します。

パラメータはtime, value, codeである。値は、オブジェクトが配置されている価格に対応します。

その時刻と値を取得する方法(関数など)はありますか?

\\\\\

あるいは、広い意味で、(トレンドライン、フィボナッチライン、ガネットは別として)その時間と価格を瞬時に取得できるようなオブジェクトはないのでしょうか?

チャート上にマーカーを置き、そこから情報を得る必要がある。トレンドライン、フィボなどの描画。- 非常に面倒で遅い・・・。

回答ありがとうございました !

PS 勉強を始めたばかりなのに...。

 
ilmel:

皆さん、こんにちは。

ここでは、グラフ上のオブジェクトを紹介します。

パラメータはtime, value, codeである。値は、オブジェクトが配置されている価格に対応します。

その時刻と値を取得する方法(関数など)はありますか?

\\\\\

あるいは、もっと広い意味で、時間と価格ですぐに導き出せるモノ(トレンドライン、フィボナッチライン、ガネットは別として)はあるのでしょうか?

チャート上にマーカーを置き、そこから情報を得る必要がある。トレンドライン、フィボなどの描画。- 非常に面倒で遅い・・・。

回答ありがとうございました !

PS 勉強を始めたばかりなのに...。

https://docs.mql4.com/ru/objects/objectgetdouble
https://docs.mql4.com/ru/objects/objectgetinteger