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

 

こんにちは、この質問に興味があります。アルパリでは、アドバイザーをアップロードするサーバーを用意して、24時間 体制で作業できるようにしているのでしょうか?直接お返事いただけますか?

 
gheka:

うまくいきませんね、ここを変えるか、開始の後に入れるかしないといけないのかもしれませんね。

紙に書かれたあなたのコードを、私が理解できるロシア語に翻訳しようとしましたが、うまくいきません。

特に各条件が続く場合、8つの条件のうち1つの条件が続くと複雑すぎる。

もちろん、このコードを作った人が奇跡であることに異論はありませんが、私にとっては完全な倒錯です(良い意味で)。

標準機能以外の各操作や条件には、コメントをつけるのが面倒です。


コードに冗長な部分がありますが、かなり読みやすいコードになっています

 
かいこうもんだい例えば、異なる時代に適用されるべきオペレータの 特定のシーケンスが あります...私はそれがcicleの形でそれを行うことが容易であることを理解するように...。を期間変更することで、...ドキュメントにピリオド値を返す関数があるのですが、それを変更する関数が見つかりません...何か間違っているのでしょうか?
 

このコードではなく、何かがうまくいっていないのでは...?:)

bool isCloseLastPosByStop(string sy="", int op=-1, int mn=-1) {// Объявление функции. Передаваемые параметры: sy = символ, op - тип, mn - магик
  datetime t;                                                  // Переменная содержит время закрытия ордера
  double   ocp, osl;                                           // ocp - цена закрытия позиции, osl - цена СтопЛосс закрытой позиции
  int      dg, i, j=-1, k=OrdersHistoryTotal();                // k содержит общее количество ордеров в истории

  if (sy=="0") sy=Symbol();                                 // Если в ф-цию передан sy равный 0 или NULL, то использовать символ графика
  for (i=0; i<k; i++) {                                     // Цикл по массиву закрытых ордеров
    if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY)) {      // Если выбран ордер из массива закрытых ордеров, ...
      if (OrderSymbol()==sy || sy=="") {                    // ... если его символ совпадает с нашим, ...
        if (OrderType()==OP_BUY || OrderType()==OP_SELL) {  // ... если его тип Бай или Селл, ...
          if (op<0 || OrderType()==op) {                // ... если тип ордера равен или -1 (имеется ввиду любой) или равен переданному в ф-цию, ...
            if (mn<0 || OrderMagicNumber()==mn) {       // ... если его магик или любой (-1) или равен переданному в ф-цию (магику советника), ...
              if (t<OrderCloseTime()) {    // ... если переменная t содержит время закрытия меньше, чем время закрытия выбранного ордера, то ...
                t=OrderCloseTime();        // ... то присвоим переменной t время закрытия выбранного ордера (этот ордер закрыт позже предыдущего)
                j=i;                                        // Запишем в переменную j индекс найденного ордера с максимальным временем закрытия
              }
            }
          }
        }
      }
    }
  }                                                       // По окончании цикла в переменной j находится индекс последнего закрытого ордера
  if (OrderSelect(j, SELECT_BY_POS, MODE_HISTORY)) {      // Выберем его по индексу
    dg=MarketInfo(sy, MODE_DIGITS);                       // Количество цифр после десятичного точки в цене инструмента, заданного переменной sy
    if (dg==0) if (StringFind(OrderSymbol(), "JPY")<0) dg=4; else dg=2; // Честно... точно не скажу, но вижу, что корректировка под йену
    ocp=NormalizeDouble(OrderClosePrice(), dg);           // Нормализуем цену закрытия ордера для дальнейшего сравнения с ценой СтопЛосс
    osl=NormalizeDouble(OrderStopLoss(), dg);             // Нормализуем цену СтопЛосс ордера для сравнения с ценой закрытия
    if (ocp==osl) return(True);                           // Если эти цены равны, значит поза закрыта по стопу, возвращаем значение "Истина"
  }
  return(False);                                          // Возвращаем "Ложь"
}

それだけの理屈で...。Viktorの言う通り、冗長ですが、できるだけシンプルに......。:)

 
Skopcheny:
が、プログラム内の期間を変更することについての質問 ...例えば、異なる時代に適用されるべき特定のオペレータの順序があります...私はそれをタイムラインの形で行うことが容易であると理解しています...を期間変更することで、...ドキュメントにピリオド値を返す関数があるのですが、それを変更する関数が見当たりません。何が間違っているのでしょうか?

グラフの周期は、以下の値のいずれかを指定します。

定数 価値 商品説明
PERIOD_M1 1 1分
PERIOD_M5 5 5分
PERIOD_M15 15 15分
PERIOD_M30 30 30分
PERIOD_H1 60 1時間
PERIOD_H4 240 4時間
PERIOD_D1 1440 1日
PERIOD_W1 10080 1週間
PERIOD_MN1 43200 1ヶ月
0(ゼロ) 0 現在のグラフの期間
 
ありがとうございました。ある期間に作業するオペレータのグループは、この表に示されているように、彼らの前にある期間の一つを指定するだけで十分なのでしょうか?
 
Skopcheny:
ありがとうございました。ある期間に作業するオペレータのグループは、この表に示されているように、彼らの前にある期間の一つを指定するだけで十分なのでしょうか?
質問に正しく答えるには、少なくともピリオドを指定する必要があるコードの例を見る必要があります...
 
artmedia70:
正しい答えを出すには、少なくとも、具体的に期間を設定する必要があるサンプルコードを見る必要があります...


string trend() {int count,count_change; double bar_centr; string trend; bool clear; for (int i=10;i!=0;i--) { bar_centr = (High[i]-Low[i])/2+Low[i]); if (bar_centr>((High[i+1]-Low[i+1])/2+Low[i+1]) count++; if (bar_centr<((High[i+1]-Low[i+1])/2+Low[i+1]) count--; } Print (count, "period " );














,Period()); if (count>3) trend="buy"; if (count<-3) trend="sell"; if (count<3||count>-3) trend="uncertain"; return(trend);}.










この機能は、異なる期間に一貫して適用される必要があります ...ターミナルで時間軸を変えてWindowsに接続すると動作するのですが・・・。問題は、EAが複数の異なる期間を処理することが可能かどうかということです ...

 
Skopcheny:


この関数は、異なる期間に連続して適用する必要があります ...ターミナルでEAとWindowsを異なる周期で接続すると動作するのですが・・・。問題は、EAが複数の異なる期間を処理することが可能かどうかということです ...

この関数は、現在のチャートとピリオドだけでなく、渡された任意のピリオドでも動作するようにしたいとのことですが ...

string trend(string sy="", int tf=0)
{
   int count,count_change;
   double bar_centr;
   string trend;
   bool clear;

   if (sy=="" || sy=="0") sy=Symbol();      
   if (tf==0) tf=Period();
   
   for (int i=10; i>0; i--)
      {
         bar_centr = (iHigh(sy,tf,i)-iLow(sy,tf,i))/2+iLow(sy,tf,i);
         if (bar_centr>((iHigh(sy,tf,i+1)-iLow(sy,tf,i+1))/2+iLow(sy,tf,i+1)))
            count++;
         if (bar_centr<((iHigh(sy,tf,i+1)-iLow(sy,tf,i+1))/2+iLow(sy,tfi+1)))
            count--;
      }

   Print (count,"период ",tf);

   if (count>3) trend="покупка";
   if (count<-3) trend="продажа";
   if (count<3||count>-3) trend="неопределенность";

   return(trend);
}

では、次のように関数を呼び出してください。

trend(Symbol(), Period()); // EAがホバリングしているチャートと期間の値が返されます...

trend(USDJPY, PERIOD_D1); //USDJPYのシンボルと 期間 "1日 "の値を返します。

PERIOD_D1 の代わりに 1440 と入力しても、同じ結果になります...

パラメータなしで呼ばれた場合、この関数は現在のシンボルとピリオドの値を返します(これらはデフォルトで設定されています)。

 
artmedia70:

現在のグラフと期間だけでなく、渡されたどのグラフでも関数が動作するようにしたいとのことですが...。

では、このように関数を呼び出してください。

trend(Symbol(), Period()); // EAがホバリングしているチャートと期間の値が返されます...

trend(USDJPY, PERIOD_D1); // USDJPYのシンボルと期間 "1日 "の値を返します。

PERIOD_D1 の代わりに 1440 と入力しても同じです...。




包括的な答え...どうもありがとうございました