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

 
shtr:

みなさん、こんにちは。

注文が開始されない理由を教えてください。

イニシエーションはイニシエーション、トレードはトレード。EAにはOnTickがあるのだから、すべてをinitに詰め込む必要はないのでは...。

また、イナイトには、開発者が考案した特別な終了コードがありますが、なぜそれを使わないのですか?

 
evillive:

イニトゥはイニトゥのために、トレードはトーゴのために。EAにはOnTickがあるのだから、すべてをinitに押し込む必要はないのでは...。

また、イナイトには、開発者が考案した特別な終了コードがありますが、なぜそれを使わないのでしょうか?

おそらく、イナイレターミネーションコードを知らないからでしょう。チュートリアルの例は、エディタ上のフォームとは異なります。例えば、int start()関数がそこにはないのです。チュートリアルにある簡単なExpert Advisorの例を initeに貼り付けたら、なぜかうまくいきました。しかし、何を書いてもうまくいかなかった。そこで、2週間ほど実験した後、専門家に相談することにしたのです。ご指摘ありがとうございます。

全部OnTickに入れましたが、何も変わりません。

 
shtr:

私たちが使っていないのは、init完了コードを知らないからに違いありません。教科書に載っている例と編集部にある形が違う。例えば、int start()関数がそこにはないのです。チュートリアルにある簡単なExpert Advisorの例をiniteに貼り付けたら、なぜかうまくいきました。しかし、何を書いてもうまくいかなかった。そこで、2週間ほど実験した後、専門家に相談することにしたのです。ご指摘ありがとうございます。

OnTickに全部放り込んだが、何も変わらない。

チュートリアルは忘れてください、それは古い構文を使って書かれています、その後多くのことが変わりました。端末配信のヘルプが最も適切で、kodobaseも、見ればMQLの新バージョンで例のソースになっています。

そして、すべてのコードをiniteに書かないことについては、以前はそうでしたが、フォーラムを検索すると、このフォーラムのすべての言語で何百もの投稿があり、ちょうど毎回、読者でない新しい作家がいます;)

 
evillive:

チュートリアルは忘れてください、それは古い構文に従って書かれています、その後、多くの変更がありました。端末配信のヘルプが最も適切で、kodobaseも、見ればMQLの新バージョンで例のソースになっています。

そして、すべてのコードをiniteに書かないことについては、以前はそうでしたが、フォーラムを検索すると、このフォーラムのすべての言語で何百もの投稿があり、ちょうど毎回、読者ではない新しい作家がいる;)

ありがとうございます。

古い教科書は、関連性がなくなったら、すぐに消さないといけないのです))

 
shtr:

ありがとうございました。

古いチュートリアルは、関連性がなくなったら、即座に燻されるべきです))

そして、OnTickにすべてを投げ込まず、トレードに関連するものだけ、起動時にのみ実行されるコードの部分はOnInitに残すべきです(もちろん、関数の名前はラテン語で書かれるべきで、ただ毎回フォーラムのレイアウトを変更するのは怠慢なことです)。

コードそのものについては、ループに疑問がありますね、変ですね、私見では中括弧が足りませんね...。

はい、また、損益レベルの計算についても、正しく規定されていません。サーバーは、pipsの値ではなく、できれば正規化された価格を送信する必要があります。

 
evillive:

そして、すべてをOnTickに入れるのではなく、トレードに関連するものだけをOnInitに入れ、起動時にのみトリガーするコードの一部を残すべきです(もちろん、関数名はラテン語で書くべきです、ただ、フォーラムのレイアウトを毎回変えるのは面倒くさいです)。

コードそのものについては、ループに疑問がある、おかしい、中括弧が足りないのでは...。

はい、また、損益レベルの計算についても、正しく規定されていません。サーバーは、pipsの値ではなく、できれば正規化された価格を送信する必要があります。

了解です、ありがとうございます。ブラケットを確認します。エディタではエラーは出ませんでした。

なぜ、この本の例がうまくいったのでしょうか?すべての関数を削除し、intの先頭から例のコードだけを挿入しました。エラーはなく、取引は開始された。

 
shtr:

了解です、ありがとうございます。ブラケットを確認します。エディタではエラーは出ませんでした。

なぜ、この本の例が有効だったのか...?全ての関数を削除し、int型から始まるサンプルコードのみを挿入しました。エラーはなく、取引は開始された。

まあ、うまくいったものを交換する必要はないのですが ))))

スタートとオンティックの違いを新たに質問されるのであれば、スタートからオンティックにすべて移行しているはずです。というか、あなたの場合、OnInitからOnTickへ。

コンパイラはシンタックスエラーを記録し、人間以外はロジックをチェックしない。特殊なケースでは、コードの作者でさえも混乱することがあります :)

 
evillive:

まあ、うまくいったものは取引する必要がなかったのですが ))))

そしてInt startは旧方式、OnTickは新方式のEAなので、startから全てOnTickに移動させれば良かったのでは?というか、あなたの場合、OnInitからOnTickへ。

コンパイラはシンタックスエラーを記録し、人間以外はロジックをチェックしない。特殊なケースでは、コードの作者でさえも混乱することがあります :)

//+------------------------------------------------------------------+
//| 3333.mq4
//| Copyright 2016, MetaQuotes Software Corp.
//| https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright"Copyright 2016, MetaQuotes Software Corp."
#プロパティリンク "https://www.mql5.com"
#property version "1.00"
#プロパティの厳密さ
extern int MA_1=5;
extern int MA_2=20;
extern MA_3=80;
extern inttern TP=100;
extern int SL=50;
extern double Lot=0.1;
文字列 Symb;
//+------------------------------------------------------------------+
//| 専門家による初期化機能
//+------------------------------------------------------------------+
int OnInit()
{
//---
//---
return(INIT_SUCCEEDED);
}

//+------------------------------------------------------------------+
//| 専門家による初期化関数
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
//---
}
//+------------------------------------------------------------------+
//| エキスパートティック機能
//+------------------------------------------------------------------+
void OnTick()
{
double MA_1_t;
double MA_2_t;
double MA_3_t;
intの合計です。
int pos;
Symb=Symbol()です。
合計=0;
for( pos=1; pos<=OrdersTotal(); pos++)
pos=OrderSelect(pos-1,MODE_TRADES);
if(pos==0)
MA_1_t=iMA(NULL,0,MA_1,0,MODE_EMA,PRICE_CLOSE,0);
MA_2_t=iMA(NULL,0,MA_2,0,MODE_EMA,PRICE_CLOSE,0);
MA_3_t=iMA(NULL,0,MA_3,0,MODE_EMA,PRICE_CLOSE,0);
if(MA_2_t>MA_3_t&&MA_1_t<MA_2_t&&Open[1]<MA_1_t&&Close[1]>MA_1_t)
{
double stoploss=NormalizeDouble(Ask-SL*Point,Digits);
double takeprofit=NormalizeDouble(Ask+TP*Point,Digits)です。
pos=OrderSend(Symbol(),OP_BUY,Lot,Ask,3,stoploss,takeprofit, "My order",16384,0,clrGreen);
を返します。
}
if(MA_2_t<MA_3_t&&MA_1_t>MA_2_t&&Open[1]>MA_1_t&&Close[1]<MA_1_t)
{
double stoploss=NormalizeDouble(SL*Point-Bid,Digits);
double takeprofit=NormalizeDouble(Bid-TP*Point,Digits)です。
pos=OrderSend(Symbol(),OP_SELL,Lot,Bid,3,stoploss,takeprofit, "My order",16384,0,clrRed);
を返します。
}
を返します。
}
//---

//+------------------------------------------------------------------+

"まあ、うまくいったものは、身売りする必要はなかった)))"まあ、自分で何か落書きしたいんでしょうけど(笑)。

操られた後、患者は正気に戻らなかった。

 
shtr:

"まあ、うまくいったものを下取りに出すべきじゃなかったな"))まあ、自分で何か落書きしたいんでしょうけど(笑)。

患者は操作の後、正気に戻らなかった。

まあ、論理や計算がいい加減なので、そううまくいかないのは明らかですが。

例えば、なぜこのEAでサイクルが必要なのか?つまり、与えられたシンボルとマジシャンの注文がすでにいくつあるのかを計算する必要があるのは明らかですよね?しかし、ここでわかることは、ループは何もカウントしておらず、「カウンター」がねじ込まれていないためカウントできない、ということです ))))

Total=0;                                   

   for( pos=1; pos<=OrdersTotal(); pos++)         
   pos=OrderSelect(pos-1,MODE_TRADES); И что дальше? Переменная pos всегда или 0, или 1, цикл сбивается постоянно на начало, а то и заглючить может и превратиться в бесконечный цикл.

OrderSelect() は真偽値を返しますが、pos 変数には適していません。また、ループは順番を飛ばさないように、古い順番から、つまり逆順に開始するのがよいでしょう。

Total変数はカウンタとして有用である。

for(pos=OrdersTotal()-1;pos>=0;pos--)
{
  if(OrderSelect(pos,MODE_TRADES)) //Обязательно проверить, выбран ли ордер
  { 
    if(OrderSymbol()==Symbol()) //желательно проверить, тот ли это ордер по символу, ещё можно по магику проверить дополнительно в этой же строке
    {
     Total++; //если это наш ордер, добавляем счётчику единицу
    }
  }
}
if(Total<1)
{
  торгуем
}

不要なものを削除し、OrderSendの後にエラー出力を追加し、ECNでない口座のテスターではすでに注文が開いています。

#property version   "1.00"
#property strict
extern int MA_1=5;
extern int MA_2=20;
extern int MA_3=80;
extern int TP=100;
extern int SL=50;
extern double Lot=0.1;

//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
{
  
   double MA_1_t=0;
   double MA_2_t=0; 
   double MA_3_t=0;
   int Total=0;
   
   for(int pos=OrdersTotal()-1;pos>=0;pos--)
   {
     if(OrderSelect(pos,MODE_TRADES)) //Обязательно проверить, выбран ли ордер
     { 
       if(OrderSymbol()==Symbol()) //желательно проверить, тот ли это ордер по символу, ещё можно по магику проверить дополнительно в этой же строке
       {
        Total++; //если это наш ордер, добавляем счётчику единицу
       }
     }
   }
   if(Total<1)
   {
      MA_1_t=iMA(NULL,0,MA_1,0,MODE_EMA,PRICE_CLOSE,0);
      MA_2_t=iMA(NULL,0,MA_2,0,MODE_EMA,PRICE_CLOSE,0); 
      MA_3_t=iMA(NULL,0,MA_3,0,MODE_EMA,PRICE_CLOSE,0);
  
      if(MA_2_t>MA_3_t&&MA_1_t<MA_2_t&&Open[1]<MA_1_t&&Close[1]>MA_1_t)
      {
         double stoploss=NormalizeDouble(Ask-SL*Point,Digits);
         double takeprofit=NormalizeDouble(Ask+TP*Point,Digits);
         if(OrderSend(Symbol(),OP_BUY,Lot,Ask,6,stoploss,takeprofit,"My order buy",16384,0,clrGreen)<1) 
         Print("OrderSend error #",_LastError," BuySL=",stoploss," BuyTP=",takeprofit);
      }
    
      if(MA_2_t<MA_3_t&&MA_1_t>MA_2_t&&Open[1]>MA_1_t&&Close[1]<MA_1_t)
      {
         double stoploss=NormalizeDouble(Bid+SL*Point,Digits);
         double takeprofit=NormalizeDouble(Bid-TP*Point,Digits);
         if(OrderSend(Symbol(),OP_SELL,Lot,Bid,6,stoploss,takeprofit,"My order sell",16384,0,clrRed)<1)
         Print("OrderSend error #",_LastError," Sell SL=",stoploss," Sell TP=",takeprofit);
      }
   }
}

あ、そうそう、あと販売のSLレベルの計算も間違っていました、もっと気をつけないといけませんね。

 
evillive:

まあ、理屈や計算がいい加減だから、そううまくいかないのは明らかだけどね。

例えば、なぜこのEAにサイクルがあるのでしょうか?つまり、与えられたシンボルとマジックナンバーに対して、どれだけの注文があるかを計算する必要があることは明らかですよね?しかし、ここでわかることは、ループは何もカウントしておらず、「カウンター」がねじ込まれていないためカウントできない、ということです ))))

OrderSelect() は真偽値を返しますが、pos 変数には適していません。また、ループは順番を飛ばさないように、古い順番から、つまり逆順に開始するのがよいでしょう。

Total変数はカウンタとして有用である。

不要なものを削除し、OrderSendの後にエラー出力を追加し、ECNでない口座のテスターではすでに注文が開いています。

そうそう、あと販売のSLレベルの計算も間違っていました、もっと気をつけないといけませんね。

うわあああああああああああああああああああああああああああああああああああああああああああああありがとうございます!!!それには反省が必要です。

もしかしたら、どこかに新ルールに関する「自習書」があるのでは?ページ番号が4桁なのはちょっとストレス...。