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

 

スクリプトはEAと見分けがつかない...。

EAのようにパラメータ付きのダイアログを表示するために、スクリプトで#property show_inputsが使われていることがありますが(当たり前のようにあります)、違いがわかりにくいですね......。

 

アルゴリズムを提案してもらえますか?高値の時間枠の高値と安値の時間枠の安値の時間を見つける必要があります。

   double H=iHigh(NULL,TF2,i);
   double L=iLow(NULL,TF2,i);  
   datetime timeH=
   datetime timeL=
 
zfs:

アルゴリズムを提案してもらえますか?低い時間枠の中で高い時間枠の高値と安値の時間を見つける必要があります。

覚えておくか、すぐにi - 見つかったインデックスを使用します。

また、iTime(NULL,TF2,i)は時刻となる。

 
Craft:

朝まで持ちこたえられなかった。少しはマシになったが、オーダブルーム配置は避けられなかった。必要な条件で1回の注文を設定するにはどうしたらよいですか?注文履歴の分析しかないのですが、どうすればいいのでしょうか、他に何かいい方法はありますか?

このように

int i,orders_total=OrdersTotal();

bool order_on_last_bar=false;

if(orders_total>0) //если есть ордера
{
   for(i=orders_total-1;i>=0;i--) //перебираем их все
   {
      OrderSelect(i,SELECT_BY_POS);
      if(iBarShift(OrderOpenTime())==0) //если номер бара, соответствующего сремени открытия, равен 0
         order_on_last_bar=true; //фиксируем этот факт
   }
}

if(order_on_last_bar==false) // на нулевом баре нет открытых ордеров
{
   //делаем то что нам нужно
}
 

以前にも質問したことがあるのですが、今また必要なのは、ポジションを建てるための最大ボリュームを 計算することです。このように書いています。

// Расчет максимального объема
   for (double m = 0.1; AccountFreeMarginCheck(Symbol(),OP_SELL,m)>30; m = m + 0.1)
      {
       Max_lots   = m;
       double Ost = AccountFreeMarginCheck(Symbol(),OP_SELL,m);
      }

しかし、Max_lotsは常にゼロに等しい...。このようなことを計算するのは、もっと有能な人がいるのでは?

 
alsu:

このように

iBarShift関数の 値をすべて埋めましたが(以前コンパイルでエラーになりました)、int iはすでに上で宣言されています。 実験のためにこのリプレイを削除してjに置き換えようとしましたが、うまくいきませんでした - いくつかのバーで複数の注文のオープン/クローズが発生しています。以下、開封条件付きのコードです。もしかしたら、何か失敗しているかもしれません。他に何ができるのか?

   int j,orders_total=OrdersTotal();

bool order_on_last_bar=false;

if(orders_total>0) //если есть ордера
{
   for(j=orders_total-1;j>=0;j--) //перебираем их все
   {
      OrderSelect(j,SELECT_BY_POS);
      if(iBarShift(NULL,0,OrderOpenTime())==0) //если номер бара, соответствующего времени открытия, равен 0
         order_on_last_bar=true; //фиксируем этот факт
   }
}

if(order_on_last_bar==false) // на нулевом баре нет открытых ордеров
{
while(true)                                  // Цикл закрытия орд.
     {
      if (Total==0 && Opn_B==true)              // Открытых орд. нет +
        {                                       // критерий откр. Buy
         RefreshRates();                        // Обновление данных
         Alert("Попытка открыть Buy. Ожидание ответа..");
         Ticket=OrderSend(Symb,OP_BUY,Lts,Ask,2,0,0);//Открытие Buy
         if (Ticket > 0)                        // Получилось :)
           {
            Alert ("Открыт ордер Buy ",Ticket);
            return;                             // Выход из start()
           }
         if (Fun_Error(GetLastError())==1)      // Обработка ошибок
            continue;                           // Повторная попытка
         return;                                // Выход из start()
        }
      if (Total==0 && Opn_S==true)              // Открытых орд. нет +
        {                                       // критерий откр. Sell
         RefreshRates();                        // Обновление данных
         Alert("Попытка открыть Sell. Ожидание ответа..");
         Ticket=OrderSend(Symb,OP_SELL,Lts,Bid,2,0,0);//Открытие Sel
         if (Ticket > 0)                        // Получилось :)
           {
            Alert ("Открыт ордер Sell ",Ticket);
            return;                             // Выход из start()
           }
         if (Fun_Error(GetLastError())==1)      // Обработка ошибок
            continue;                           // Повторная попытка
         return;                                // Выход из start()
        }
      break;                                    // Выход из while
     }
  }
 
Craft:

iBarShift関数の値をすべて埋めましたが(以前コンパイルでエラーになりました)、int iはすでに上で宣言されています。このリプレイを削除して、きれいな実験のためにjに置き換えようとしましたが、うまくいきませんでした - いくつかのバーで複数の注文のオープン/クローズがありました。以下、開封条件付きのコードです。もしかしたら、何か失敗しているかもしれません。他に何ができるのか?

1.Total変数とは何ですか?その値はどこに代入されていますか?

2.2番目のif(Total=0 if()の前にelseを置いた方が良い。

 
alsu:

1.Total変数とは何ですか?その値はどこに代入されていますか?

これは、記事「Simple Expert」(https://book.mql4.com/ru/samples/expert)の例に基づいています。

int start()
  {
   int
   Total,                           // Количество ордеров в окне 
...
   // Учёт ордеров
   Symb=Symbol();                               // Название фин.инстр.
   Total=0;                                     // Количество ордеров
   for(int i=1; i<=OrdersTotal(); i++)          // Цикл перебора ордер
     {
      if (OrderSelect(i-1,SELECT_BY_POS)==true) // Если есть следующий
        {                                       // Анализ ордеров:
         if (OrderSymbol()!=Symb)continue;      // Не наш фин. инструм
         if (OrderType()>1)                     // Попался отложенный
           {
            Alert("Обнаружен отложенный ордер. Эксперт не работает.");
            return;                             // Выход из start()
           }
         Total++;                               // Счётчик рыночн. орд
         if (Total>1)                           // Не более одного орд
           {
            Alert("Несколько рыночных ордеров. Эксперт не работает.");
            return;                             // Выход из start()
           }
         Ticket=OrderTicket();                  // Номер выбранн. орд.
         Tip   =OrderType();                    // Тип выбранного орд.
         Price =OrderOpenPrice();               // Цена выбранн. орд.
         SL    =OrderStopLoss();                // SL выбранного орд.
         TP    =OrderTakeProfit();              // TP выбранного орд.
         Lot   =OrderLots();                    // Количество лотов
        }
     }
 

alsu:

2.2番目の if(Total==0) の前に、else if(.

アルス 邪魔して悪いんだけど、どうしても真相を知りたいんだ。
 
Craft:
alsu さん 押し付けがましくて申し訳ないですが、どうしても解決したい(終結させたい)のです。

どうってことない

単純なEAから/* */コードの一部をコミットして、Totalをorders_totalに置き換えてみて ください - 私たち自身が宣言した変数です。