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

 

こんにちは。

私の戦略はスプレッドを考慮したもので、スプレッドは関数で定義されています。

double Spread_(){
   double spread = 0.0;
     RefreshRates();
     spread = MathRound((Ask - Bid) / Point);
   return(spread);
}   

しかし、ストラテジーテスターでは スプレッドが一定なので、ランダムスプレッドエミュレーターが必要なのです。2~3ポイント(4桁)の範囲で80%、3ポイント以上の範囲で20%の割合でテスターでの広がりの変化をエミュレートしたいです。どのように実装すればよいか、また、そのようなアイデアが解決されたリンクがあれば教えてください。

 
artmedia70:


マジシャンのミスにより、EAがストップでクローズしたときに、そのポジションがストップでクローズしたことを認識しないことがあります。なぜ?答えは、マジック123でポジションを開き、ストップでポジションを閉じるかどうかをチェックする関数に変数Magicを送るというものです。暗黙のうちに初期化された場合、何に相当するのでしょうか?ゼロです。この機能は、当然ながらマジックナンバー0を持つポジションを検索し、それが自分のポジションで123と等しくなるようにします。そして、私たちは議論しているのではなく、ただ...推理...停止時に閉じるレスポンスを確認する。


私はあなたの「死んだ」EAロジックの残りを見ていません - 私はあなたがストップクローズチェック機能を理解するのを手伝っていたのですが...。


Artem !ごきげんよう! いつもありがとうございます。

不要な「死語」ロジックをすべて削除し、残ったものを「復活」させた......。私の理解する限りでは

1つの機能だけを残し、それを修正するのに役立っています。

しかし、私の理解を超えた奇跡が起こり始めたのです。

1. Expert Advisorは各ロー ソク足の最初に取引を開始します(私は5分のローソク足を持っています)。

と条件をすべて無視する。

すなわち、コントロールは最初の行に入る

double Price=iOpen(Symbol (),0,0);

そして、11行を飛び越え、次の行にたどり着きます。

Lot=0.1;

OrderSend(Symbol(),OP_SELL,1,Bid,Lot,Ask+1500*Point,Ask-300*Point, "jfh",123 );

2. 最小ロットを計算する行を削除した場合 Lot=MarketInfo(Symbol(), MODE_MINLOT);

Expert Advisorは問題なく動作しますが、isCloseLastPosByStop関数が動作 しません。

ずっと頭を悩ませていたのですが......無駄でした。 どこにエラーが隠れているのか、教えていただけるとありがたいです。

double   Lot = 0.1;                                          //я проинициализировал переменную
int      Magic=123;

int start() 
{

   double Price=iOpen(Symbol (),0,0);                      //запоминаем время открытия очередной свечи
   int ot=OrdersTotal();                                   //запоминаем количество всех открытых ордеров
      if ((ot==0)                                         //если ордеров в рынке никаких нет
      &&(Bid==Price)                                     //И ПРИ ЭТОМ  если  цена = цене открытия очередной свечи
         &&(Open[1]-Close[1]>100*Point&&Open[1]-Close[1]<120*Point)      //И ПРИ ЭТОМ  если свеча N1 соответствуе этим параметрам
            &&(High[1]-Open[1]>40*Point&&High[1]-Open[1]<60*Point)       //И ПРИ ЭТОМ  если свеча N1 соответствуе этим параметрам
                &&(Close[1]-Low[1]>40*Point&&Close[1]-Low[1]<60*Point))  //И ПРИ ЭТОМ  если свеча N1 соответствуе этим параметрам
                
                  Lot=MarketInfo(Symbol(), MODE_MINLOT);                  //вычислить минимальный лот инструмента
                               
                  if (isCloseLastPosByStop(Symbol(), OP_BUY, Magic, Lot))//вызываем функцию,если она вернула(не понимаю-ведь функция
                     {                                                   //должна вернуть и положить сюда true или False,а здесь совсем другие передаваемые парам.)
                     t=Lot*2; // удваиваем начальный лот
                     OrderSend(Symbol(),OP_SELL,Lot,Bid,1,Ask+1500*Point,Ask-300*Point,"jfh",123 );
                     }
                  else                                                    //в противном случае(если функция на вернула ??????
                     {
                     Lot=0.1;                                             // лот отстается 0.1       
                     OrderSend(Symbol(),OP_SELL,1,Bid,Lot,Ask+1500*Point,Ask-300*Point,"jfh",123 );
                     }
                      
   return(0);
}
//+----------------------------------------------------------------------------+
bool isCloseLastPosByStop(string sy, int op, int mn, double &ll) {
   double   pt;
   int      dg, i, j=-1, k=OrdersHistoryTotal()-1;
   datetime t=0;                                   // во избежание возможных ошибок после возможных будущих улучшений
   for (i=k; i>=0; i--) {
     if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY)) {
         if (OrderMagicNumber()!=mn)   continue;   // если магик не тот, переходим к следующему
         if (OrderSymbol()!=sy)        continue;   // если символ не тот, переходим к следующему
         if (OrderType()!=op)          continue;   // если тип не тот, переходим к следующему
         if (t<OrderCloseTime()) {
            t=OrderCloseTime();
            j=i;
            }
         }
      }
   if (OrderSelect(j, SELECT_BY_POS, MODE_HISTORY)) {
      dg=MarketInfo(OrderSymbol(), MODE_DIGITS);      // количество знаков в цене символа ордера
      pt=MarketInfo(OrderSymbol(), MODE_POINT);       // размер пункта инструмента в валюте котировки ордера
      if (MathAbs(OrderClosePrice()-OrderStopLoss())<0.5*pt) { // Если закрыт по стопу
         ll=OrderLots();                              // записываем количество лотов в ордере, закрытом по стопу
         return(true);                                // возвращаем истину
         }
      }
   return(False);                                     // возвращаем ложь (позиции нету, либо не по стопу)
}


 

solnce600

Артем ! Добрый день! Еще раз спасибо за помощь.

私の「死んだ論理」はすべて不要なものを取り除き、残りを「復活」させる...。私の理解する限りでは

実質的に機能だけを残したのですが、それを修正するのに協力していただきました。

しかし、私の理解を超えた奇跡が起こり始めている。

 if ((ot==0)                                         //если ордеров в рынке никаких нет
      &&(Bid==Price)                                     //И ПРИ ЭТОМ  если  цена = цене открытия очередной свечи
         &&(Open[1]-Close[1]>100*Point&&Open[1]-Close[1]<120*Point)//И ПРИ ЭТОМ  если свеча N1 соответствуе этим параметрам
            &&(High[1]-Open[1]>40*Point&&High[1]-Open[1]<60*Point)
               &&(Close[1]-Low[1]>40*Point&&Close[1]-Low[1]<60*Point))

ボディにすべてを追加する { } 。

アルテムじゃなくてごめんね。

 
ALXIMIKS:

solnce600

ボディにすべてを追加する { } 。

アルテムじゃなくてごめんね。

ありがとうございます、初めてでごめんなさい。
 
 t=Lot*2; // удваиваем начальный лот
                     OrderSend(Symbol(),OP_SELL,Lot,Bid,1,Ask+1500*Point,Ask-300*Point,"jfh",123 );

t or Lot ?

 
ALXIMIKS:

solnce600

ボディにすべてを追加する { } 。

アルテムじゃなくてごめんね。

あなたが言ったようにした...残念ながらアドバイザーが動作...isCloseLastPosByStop関数が動作しません。

double   Lot=0.1;
int      Magic=123;

int start() 
{

   double Price=iOpen(Symbol (),0,0);  //запоминаем время открытия очередной свечи
   int ot=OrdersTotal();               //запоминаем количество всех открытых ордеров
      if ((ot==0)                      //если ордеров в рынке никаких нет
      &&(Bid==Price)                   //И ПРИ ЭТОМ  если ПРИ ЭТОМ  цена = цене открытия очередной свечи
         &&(Open[1]-Close[1]>100*Point&&Open[1]-Close[1]<120*Point)//И ПРИ ЭТОМ  если свеча N1 соответствуе этим параметрам
            &&(High[1]-Open[1]>40*Point&&High[1]-Open[1]<60*Point)
               &&(Close[1]-Low[1]>40*Point&&Close[1]-Low[1]<60*Point))
               
                {
                  Lot=MarketInfo(Symbol(), MODE_MINLOT);            //вычислить минимальный лот инструмента
                               
                  if (isCloseLastPosByStop(Symbol(), OP_BUY, Magic, Lot))//вызываем функцию,если она вернула(не понимаю-ведь функция
                     {                            //должна вернуть и положить сюда true или False,а здесь совсем другие передаваемые парам.)
                     Lot=Lot*2; // удваиваем начальный лот
                     OrderSend(Symbol(),OP_SELL,Lot,Bid,1,Ask+1500*Point,Ask-300*Point,"jfh",123 );
                     }
                  else  //в противном случае(если функция на вернула??????
                     {
                     Lot=0.1; // лот отстается 0.1       
                     OrderSend(Symbol(),OP_SELL,1,Bid,Lot,Ask+1500*Point,Ask-300*Point,"jfh",123 );
                     }
                     } 
   return(0);
}
//+----------------------------------------------------------------------------+
bool isCloseLastPosByStop(string sy, int op, int mn, double &ll) {
   double   pt;
   int      dg, i, j=-1, k=OrdersHistoryTotal()-1;
   datetime t=0;                                   // во избежание возможных ошибок после возможных будущих улучшений
   for (i=k; i>=0; i--) {
     if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY)) {
         if (OrderMagicNumber()!=mn)   continue;   // если магик не тот, переходим к следующему
         if (OrderSymbol()!=sy)        continue;   // если символ не тот, переходим к следующему
         if (OrderType()!=op)          continue;   // если тип не тот, переходим к следующему
         if (t<OrderCloseTime()) {
            t=OrderCloseTime();
            j=i;
            }
         }
      }
   if (OrderSelect(j, SELECT_BY_POS, MODE_HISTORY)) {
      dg=MarketInfo(OrderSymbol(), MODE_DIGITS);      // количество знаков в цене символа ордера
      pt=MarketInfo(OrderSymbol(), MODE_POINT);       // размер пункта инструмента в валюте котировки ордера
      if (MathAbs(OrderClosePrice()-OrderStopLoss())<0.5*pt) { // Если закрыт по стопу
         ll=OrderLots();                              // записываем количество лотов в ордере, закрытом по стопу
         return(true);                                // возвращаем истину
         }
      }
   return(False);                                     // возвращаем ложь (позиции нету, либо не по стопу)
}
 

これは、関数bool isCloseLastPosByStop(string sy, int op, int mn, double &ll) のコードの一部分です。

しかし、3pipsのスリップがあった場合はどうでしょうか?あまりよく考えられていない ))

 if (MathAbs(OrderClosePrice()-OrderStopLoss())<0.5*pt) { // Если закрыт по стопу
         ll=OrderLots();                              // записываем количество лотов в ордере, закрытом по стопу
         return(true);                                // возвращаем истину
 
solnce600:

わかってくれるかな~、まだあまり気にしてないんだけど...。

なぜこの機能が使えないのか、1週間ほど試行錯誤しています。

つまり、ストップで決済した注文の2倍の出来高で、ノンストップ後の次の注文は通常の出来高で開いてほしいのです。


仕事の論理を正さないと、考える時間が長くなる
 
ALXIMIKS:

これは、関数bool isCloseLastPosByStop(string sy, int op, int mn, double &ll) のコードの一部分です。

しかし、3pipsのスリップがあった場合はどうでしょうか?あまりよく考えられていない ))


わかってくれるかな~、まだ悩んでないけど...。

なぜこの機能が思い通りに動かないのか、1週間ほど試行錯誤を続けています。

つまり、ストップで決済した注文の2倍の出来高で、ノンストップの後、次の注文を通常の出来高で開く必要があります。
 

そして、なぜ注文履歴 を触るかというと、残高を見て、どこがその方向に行ったか、ロットを変えてください。

自分の口座で取引してくれるロボットだけなら。