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

 
drknn:


コードが間違っている。まず、start()関数がint型であれば、整数値を返すはずです。条件によってのみ返送される返送があります。また、条件を満たさない場合、start()関数は端末に何を返すべきなのでしょうか?

さらに、あなたはチェックするにはあまりにも複雑です - より良い次のように行うには:我々は、注文のカウンタを作成し、開いて、今日閉鎖した。本日終了した注文の数が0より大きい場合は、取引を行いません。それ以外の場合は、トレードをすることが許されています。

intをvoidに変更しました...せわにならない

正直なところ、注文のカウンターを作って、なおかつ日次の単発取引オプションを有効・無効にする方法がよくわからないのですが・・・。

......考えよう、考えよう、こんな風にやってみよう。

if(CalculateCurrentOrders(Symbol())==0 && Orders==0)

{

CheckForOpen()です。

if(WaitForNewDay) {Orders++;}。

を返します。

}

カウンターをリセットする。

if(WaitForNewDay)CheckForNewDay();

void CheckForNewDay()

{

tm=iTime(Symbol(),PERIOD_D1,0);

if (bt!=tm) {bt=tm; Orders=0;}.

}

とにかく、逃げていたことに戻りました ))))

 
dzhini:

intをvoidに変更しました...せわにならない

正直、オーダーカウンターを作っても、一回限りのデイトレードオプションの有効・無効がわからない...。

-------------

とにかく、私が逃げていたことに戻ろう ))))

//+------------------------------------------------------------------+
//|                                                            0.mq4 |
//|                                          Copyright © 2010, Drknn |
//|                                                    drknn@mail.ru |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2010, Drknn"
#property link      "drknn@mail.ru"

// ---------- Пользовательские переменные ----------------------------
extern int      MAGIC=0;//У ордеров открытых вручную MAGIC=0

// ------------ Вспомогательные переменные --------------------------
string    ExpertName="0";// имя советника
string    SMB;
bool      DobroTorga;

//+------------------------------------------------------------------+
//|                  Блок инициализации                              |
//+------------------------------------------------------------------+
int init(){

  SMB=Symbol();
  return(0);
}
//+------------------------------------------------------------------+
//|                  Блок деинициализации                            |
//+------------------------------------------------------------------+
int deinit(){
        if (!IsTesting()){
    Comment("");
    Print("Советник деинициализирован (выключен совсем)");
  }
  return(0);
}
//+------------------------------------------------------------------+
//|                  Старт работы советника                          |
//+------------------------------------------------------------------+
int start(){
  if(!IsTradeAllowed()){
    Comment("Торговля запрещена в настройках терминала, либо торговый поток занят");
    Print("Торговля запрещена в настройках терминала, либо торговый поток занят");
    return(0);
  }
  DobroTorga=true;
  if(SchBuy(MAGIC)+SchSell(MAGIC)+HistSchBuy(MAGIC)+HistSchSell(MAGIC)>0){
    DobroTorga=false;
  }
  if(DobroTorga==true){
    // ---- добро торговать есть - ставим ордера ---------
  }
  return(0);
}
//+------------------------------------------------------------------+
//|                  Пользовательские подпрограммы                   |
//+------------------------------------------------------------------+


// =================================================================================================
// ************************* Счётчики ордеров ******************************************************
// =================================================================================================

//=========== SchBuy()  ===============================
//  Функция возвращает количество Buy-ордеров
//   SchBuy      - счётчик Buy ордеров
//-----------------------------------------------------------
int SchBuy(int MAGIC){
  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);
}                  
//==================================================================================================


//=========== SchSell()  ===============================
//  Функция возвращает количество Sell-ордеров
//  SchSell  - счётчик Sell ордеров
//-----------------------------------------------------------
int SchSell(int MAGIC){
  int SchSell=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_SELL){
        SchSell++;
      }
    }
  }
 return(SchSell);     
}                  
//==================================================================================================

//=========== HistSchBuy()  ===============================
//  Функция возвращает количество Buy-ордеров сегодняшнего дня в истории
//   SchBuy      - счётчик Buy ордеров
//-----------------------------------------------------------
int HistSchBuy(int MAGIC){
  int SchBuy=0;
  for (int i=OrdersHistoryTotal()-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){ 
        if(OrderOpenTime()>=iTime(SMB,PERIOD_D1,0)){
          SchBuy++;
        }
      }  
    }
  }
  return(SchBuy);
}                  
//==================================================================================================


//=========== HistSchSell()  ===============================
//  Функция возвращает количество Sell-ордеров сегодняшнего дня в истории
//  SchSell  - счётчик Sell ордеров
//-----------------------------------------------------------
int HistSchSell(int MAGIC){
  int SchSell=0;
  for (int i=OrdersHistoryTotal()-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_SELL){
        if(OrderOpenTime()>=iTime(SMB,PERIOD_D1,0)){
          SchSell++;
        }
      }
    }
  }
 return(SchSell);     
}                  
//==================================================================================================
 
コードについてご教授ください。手動で水平線を 引いて動かし、価格がそれに触れるとシグナルが発生するようにします。
 
Alexandr24:
コードについてご教授ください。手動で水平線を引いて動かし、価格がそれに触れるとシグナルが発生するようにしています。

価格がラインに触れる - シグナルがある。理解できました。コードのどこがおかしいのでしょうか?
 
drknn:


今日の担当はあなたです))) ありがとうございます、調べてみます
 
すみません、タスクの設定が正しくありませんでした))これを実現するコードが必要なんです。
 
Alexandr24:
すみません、タスクの設定を間違えてしまいました))。必要なのは、これを実現するようなコードです。


まず理解していただきたいのは、「線は物体である」ということです。プログラミング・コードでは、オブジェクトは名前で区別されます。コードに線の名前を書いておいて、その線をチャートにドロップするときに、その線のプロパティで、コードに書いた名前に変更する必要があるのです。そうして初めて、このオブジェクトから取得した読み取り値を処理する必要があることを、コードが理解できるのです。

次に、コードの中で、ラインが立っている価格を照会する必要があります。リクエストは doubleObjectGet(string name, int prop_id) 関数で行います。nameの代わりに行名を指定し、prop_idの代わりにOBJPROP_PRICE1を指定する必要があります。こうすることで、このラインが設定された価格をプログラム的に取得することができます。そして、コードの中で、価格がこの線に触れているかどうかをチェックする必要があります。例:前のティックの価格が線のあるレベルより低く、現在のティックでこのレベル以上であれば、このタッチが発生したことになります。

アレキサンダー、コードでどうにもならないときは、ここで助けてくれるよ。コードの実装を依頼される場合は、https://www.mql5.com/ru/job。

 
int start()
  {
   int   i, counted_bars=IndicatorCounted();
//----

 double n=ObjectGet("n",OBJPROP_PRICE1); 
 if (Close[0]==n&&Close[0]!= 0)
 Alert(Symbol(),"  n  ",n);

//----
Comment(n);
   return(0);
  }
このようにしたのですが、Close[0]==nのときにシグナルが動作しないのです。どうすれば直るのか?条件は満たしているのに、なぜかうまくいかない。
 
Alexandr24:
やってみましたが、Close[0]==nのとき、シグナルが動作しません。修正方法は?


なるほど、コードから判断して、インジケータを作ったんですね。ですから、このコードの一部が機能しているかどうかを確認するには、次のティックがラインに触れるまでじっと待つ必要があります。この部分をテストするためのスクリプトを作成した方が、すぐに結果がわかるのでよいでしょう。

まず確認しなければならないのは、コードが実際にあなたの行を見ているかということです。どうやるんですか?その価格を聞いて、アラートとして表示する必要があります。やること

//+------------------------------------------------------------------+
//| script program start function                                    |
//+------------------------------------------------------------------+
int start(){
  string LineName="1";
  double MyLine=-100;
  MyLine=ObjectGet(LineName,OBJPROP_PRICE1);
  if(MyLine>0){
    Alert ("Горизонтальная линия ",LineName," установлена на уровень = ",MyLine);
  }
  else{
    Alert("Запрос значения линии ",LineName," вренул ошибку № ",GetLastError());
  }
  return(0);
}
//+------------------------------------------------------------------+

スクリプトが再コンパイルされたので、任意のチャートを開き、その上に水平線を 描画します。そして、そのプロパティを入力し、コード内で行に「1」という名前を付けているので、行のプロパティにもこの名前を設定します。

OKをクリックします。チャート上にスクリプトをドロップし、アラートが正しい価格を返したことを確認します。チャート上の線を別の場所に移動させ、再びスクリプトをチャートに戻して、線の位置を手動で変更しても、コードがそれを見て認識することを確認します。

そして、同じように続けていくのです。

 

ビジュアライゼーションをオンにした状態でテスターを通し、インジケーターのテストを行います。アラートを発生させるためには、値を正規化する必要があるため、コードを少し修正しました。しかし、もしあなたが現在のバー、例えば1時間後にラインを移動させた場合、アラートは現在のバー上のラインのその後の移動で1回だけトリガーされます。他のバーを待たないといけない。

int start()
  {
   int   i, counted_bars=IndicatorCounted();
//----
double b=NormalizeDouble((Close[0]),Digits);
 double n=NormalizeDouble(ObjectGet("n",OBJPROP_PRICE1),Digits); 
 if (b==n&&b!= 0)
 Alert(Symbol(),"  n  ",n);

//----
Comment(n);
   return(0);
  }