[ARCHIVE]フォーラムを乱立させないために、どんなルーキーの質問でも。プロフェッショナルの皆さん、通り過ぎないでください。あなたなしではどこにも行けない - 5. - ページ 270

 
hoz:


まあ、fi_Ticketが 不要ということではなく、なぜデフォルト値の0(ゼロ)が割り当てられているのかということです。私なら、そのようにするだけです。

もう一度、ソースコードを複製して みます。

この機能により、商品別の取引情報(注文を出す前など、注文に縛られない状態)と、同じでも特定の注文に連動する状態(注文に続く状態)を取得することができます。機能の使いやすさを考慮し、デフォルト値が使用される。fi_Ticketの 負の値は、トレードライブラリの初期化時に使用されます。

追伸:そしてまず、変数名、正確にはその接頭辞に注意してください。bs_Symbolのような初期値bを 持つ変数は、ライブラリからグローバルに宣言されます。ほとんどのグローバル 変数は、b-PSI@Baseで宣言されています。

 

EAコードを見てください、原因がわかりません...。初回起動時はすぐに取引できますが、終了後は次の端末の再起動、またはEAを取引できるようにするon/offまで動作しなくなります...Gann 2.0インジケータで動作します。

extern string     s0                = "Setup: Main";
extern int        Magic             = 1121;
extern double     lots              = 0.1;
extern int        StopLoss          = 70;
extern int        TakeProfit        = 140;
extern bool       UseTrail          = true;
extern bool       TrailWhileMinus   = false;
extern int        Trail             = 70;

extern string     s1                = "Setup: GANN indicator";
extern bool UseBeginDate = false;
extern string BeginDate = "2010.01.01 00:00";
extern int nBarsBack = 120;//250;
extern string prices = "0=close, 4=median, 5=typical";
extern int Price_Mode = 5;
extern bool Show_GridMatrix = false;
extern bool Show_GannGrid = false;
extern bool Show_HiloArrows = true;
extern bool Show_PriceArrows = true;
extern bool Show_Comments = false;
extern string ____MainGrid____ = "ooo";
extern color MainGrid_Color = Silver;//Green;//Sienna;
extern int MainGrid_Style = STYLE_DOT;
extern int MinMaxGrid_Style = STYLE_SOLID;
extern int MainGrid_Width = 1;
extern int fontSize = 8;
extern bool Draw_AllGrids = false;
extern bool Draw_AdditionalGrids = false;
extern string ____GannGrid____ = "ttt";
extern color GannGrid_Color = Silver;//Gray;
extern int GannGrid_Style = STYLE_DOT;
extern int GannGrid_Width = 177;
extern string ____Default_GridParameters____ = "Recomanded GridInterval 35 or 36";
extern int MainGrid_Intervals = 3677;   //default=35(!)
extern double GannGrid_Interval = 8.0;//with default 8.5 is the time interval not OK; and 9 is too large
extern int Text_Shift = 50;

//s1, UseBeginDate, BeginDate, nBarsBack, prices, Price_Mode, Show_GridMatrix, Show_GannGrid, Show_HiloArrows, Show_PriceArrows, Show_Comments, ____MainGrid____, MainGrid_Style, MinMaxGrid_Style, MainGrid_Width, fontSize, Draw_AllGrids, Draw_AdditionalGrids, ____GannGrid____, GannGrid_Style, GannGrid_Width, ____Default_GridParameters____, MainGrid_Intervals, GannGrid_Interval, Text_Shift

int               slip              = 3;

int Ticket[1000];

void deinit() 
{
   SemaphoreDeinit("TRADECONTEXT");

   return(0);
}


int start()
{
   static datetime TimeFlag = 0;
   datetime        TimeLast = Time[0];
   if(TimeFlag < TimeLast)
   {
      TimeFlag = TimeLast;
      
      int GANN = GetSignal_GANN();
      
      AnalyzeSignals(GANN);
      
      if(UseTrail == true) TrailAllOrders();
   }
   return(0);
}



void AnalyzeSignals(int GANN)
{
   static int ticket = 0;
   int sig = -1;
   bool res;
   
   ticket = RefreshTicket(ticket);
   
   if(GANN == OP_BUY)
      sig = OP_BUY;
   else if(GANN == OP_SELL)
      sig = OP_SELL;   

   if(ticket != 0)
   {
      OrderSelect(ticket, SELECT_BY_TICKET);      
      int type = OrderType();
      
      if(sig == OP_BUY && type == OP_SELL)
      {
         SemaphoreTake("TRADECONTEXT"); 
         res = OrderClose(ticket, OrderLots(), Ask, slip);
         SemaphoreReturn("TRADECONTEXT");
         if(!res) {Alert("OrderClose Error: ", GetLastError());}
         else ticket = 0;
      }
   
      else if(sig == OP_SELL && type == OP_BUY)
      {
         SemaphoreTake("TRADECONTEXT"); 
         res = OrderClose(ticket, OrderLots(), Bid, slip);
         SemaphoreReturn("TRADECONTEXT");
         if(!res) {Alert("OrderClose Error: ", GetLastError());}
         else ticket = 0;
      } 
   }   
   
   
   if(ticket == 0)
   {   
      double _lot = lots;
   
      if(sig == OP_BUY)
      {
         SemaphoreTake("TRADECONTEXT"); 
         ticket = OrderSend(Symbol(), OP_BUY, _lot, Ask, slip, Bid - StopLoss*Point, Bid + TakeProfit*Point, NULL, Magic);
         SemaphoreReturn("TRADECONTEXT");
         if(ticket < 0) {Alert("OrderSend Error: ", GetLastError());}
      }
   
      else if(sig == OP_SELL)
      {
         SemaphoreTake("TRADECONTEXT");
         ticket = OrderSend(Symbol(), OP_SELL, _lot, Bid, slip, Ask + StopLoss*Point, Ask - TakeProfit*Point, NULL, Magic);
         SemaphoreReturn("TRADECONTEXT");
         if(ticket < 0) {Alert("OrderSend Error: ", GetLastError());}
      }
   }
}

int RefreshTicket(int ticket)
{
   bool res;
   
   if(ticket <= 0)
      return(0);
   else
   {
      res = OrderSelect(ticket, SELECT_BY_TICKET);
      if(!res)
         return(0);
      else if(OrderCloseTime() != 0)
         return(0);
   }
   
   return(ticket);      //all ok, ticket still valid
}

int GetSignal_GANN()
{
   //Alert("!!: ", s1, ";", UseBeginDate, ";", BeginDate, ";", nBarsBack, ";", prices, ";", Price_Mode, ";", Show_GridMatrix, ";", Show_GannGrid, ";", Show_HiloArrows, ";", Show_PriceArrows, ";", Show_Comments, ";", ____MainGrid____, ";", MainGrid_Color, ";", MainGrid_Style, ";", MinMaxGrid_Style, ";", MainGrid_Width, ";", fontSize, ";", Draw_AllGrids, ";", Draw_AdditionalGrids, ";", ____GannGrid____, ";", GannGrid_Color, ";", GannGrid_Style, ";", GannGrid_Width, ";", ____Default_GridParameters____, ";", MainGrid_Intervals, ";", GannGrid_Interval, ";", Text_Shift);

   double ga_up = iCustom(NULL, 0, "Gann v2.0", s1, UseBeginDate, BeginDate, nBarsBack, prices, Price_Mode, Show_GridMatrix, Show_GannGrid, Show_HiloArrows, Show_PriceArrows, Show_Comments, ____MainGrid____, MainGrid_Color, MainGrid_Style, MinMaxGrid_Style, MainGrid_Width, fontSize, Draw_AllGrids, Draw_AdditionalGrids, ____GannGrid____, GannGrid_Color, GannGrid_Style, GannGrid_Width, ____Default_GridParameters____, MainGrid_Intervals, GannGrid_Interval, Text_Shift, 
                                          4, 0);
  
   double ga_dn = iCustom(NULL, 0, "Gann v2.0", s1, UseBeginDate, BeginDate, nBarsBack, prices, Price_Mode, Show_GridMatrix, Show_GannGrid, Show_HiloArrows, Show_PriceArrows, Show_Comments, ____MainGrid____, MainGrid_Color, MainGrid_Style, MinMaxGrid_Style, MainGrid_Width, fontSize, Draw_AllGrids, Draw_AdditionalGrids, ____GannGrid____, GannGrid_Color, GannGrid_Style, GannGrid_Width, ____Default_GridParameters____, MainGrid_Intervals, GannGrid_Interval, Text_Shift, 
                                          6, 0); 

   Print("ga_up = ", ga_up);
   Print("ga_dn = ", ga_dn);
   
   if(ga_up > 0.0)
      return(OP_BUY);
   else if(ga_dn > 0.0)
      return(OP_SELL);
   else
      return(-1);   
}


int TrailAllOrders()
{
   int i, total;
   
   total = CreateTicketArray(OP_BUY, Magic);
   for(i=0; i<total; i++)
      TrailingStop(Ticket[i]);

   total = CreateTicketArray(OP_SELL, Magic);
   for(i=0; i<total; i++)
      TrailingStop(Ticket[i]);
}

void TrailingStop(int ticket)
{
   int res;
   OrderSelect(ticket, SELECT_BY_TICKET);
   
   if(OrderType() == OP_BUY)
      if(TrailWhileMinus == true || Bid-OrderOpenPrice()>Point*Trail)         //не тралим, пока не можем достичь безубытка первым переносом стопа   
         if(Bid - OrderStopLoss() > Trail*Point)
         {
            SemaphoreTake("TRADECONTEXT");
            res = OrderModify(OrderTicket(), 0, Bid - Trail*Point, OrderTakeProfit(), 0);
            SemaphoreReturn("TRADECONTEXT"); 
            if(res<0)
               Alert("TrailingStop OrderModify Error: ", GetLastError());
        }
         
   if(OrderType() == OP_SELL)
      if(TrailWhileMinus == true || OrderOpenPrice()-Ask>Point*Trail)         //не тралим, пока не можем достичь безубытка первым переносом стопа
         if(OrderStopLoss() - Ask > Trail*Point)
         {
            SemaphoreTake("TRADECONTEXT");
            res = OrderModify(OrderTicket(), 0, Ask + Trail*Point, OrderTakeProfit(), 0);
            SemaphoreReturn("TRADECONTEXT");        
            if(res<0)
               Alert("TrailingStop OrderModify Error: ", GetLastError());
         }
}

int CreateTicketArray(int dir, int SysID)
{
   int total=OrdersTotal(), i, c=0; if (total<=0) return (0);
        for(i=0;i<total;i++) { OrderSelect(i, SELECT_BY_POS); if ((OrderType()==dir) && (OrderMagicNumber()==SysID)) { Ticket[c] = OrderTicket(); c++; } }
        return (c);
}

//------------------------------------------SEMAPHORE------------------------------------------

int critical = 0; 

void SemaphoreTake(string SEM)
{ 
   if(GlobalVariableCheck(SEM) == false)
      GlobalVariableSet(SEM, 0);
  
   while(1==1)
   {
      if(GlobalVariableSetOnCondition(SEM, 1.0, 0.0))         //получили доступ
      {
         critical = 1;
         Print("SEMAPHORE \"", SEM, "\" TAKEN. CURRENT VALUE: ", GlobalVariableGet(SEM));
         break;      //выходим из цикла ожидания доступа
      }
      else
      {
         Print("ATTEMPT TO CAPTURE SEMAPHORE \"", SEM, "\" FAILED. SEMAPHORE BUSY. WAITING 0.1 SEC. CURRENT VALUE: ", GlobalVariableGet(SEM));
         Sleep(100);
      }
   }
} 

void SemaphoreReturn(string SEM)
{
   GlobalVariableSet(SEM, 0.0);
   Print("SEMAPHORE \"", SEM, "\" RETURNED. CURRENT VALUE: ", GlobalVariableGet(SEM));
   critical = 0;
}

void SemaphoreDeinit(string SEM)    //Вставить в ф-ю  deinit()
{
   if(critical == 1)
   {
      GlobalVariableSet(SEM,      0.0);    //на случай, если советника убивают, пока он в процессе посылки запроса
   }  
}
 
chief2000:
以下は、ドキュメントにあるコマンドの例です。このコマンドがどのように動作するのか把握し、パラメータを変更します。

High[iHighest(NULL,0,MODE_HIGH,20,4)];
Low[iLowest(NULL,0,MODE_LOW,10,10)];


ありがとうございました
 
chief2000:
以下は、ドキュメントにあるコマンドの例です。このコマンドがどのように動作するのか把握し、パラメータを変更します。

High[iHighest(NULL,0,MODE_HIGH,20,4)];
Low[iLowest(NULL,0,MODE_LOW,10,10)];


パソコンの調子が悪く、返信が遅くなりました。
 
chief2000:
以下は、ドキュメントにあるコマンドの例です。このコマンドがどのように動作するのか把握し、パラメータを変更します。

High[iHighest(NULL,0,MODE_HIGH,20,4)];
Low[iLowest(NULL,0,MODE_LOW,10,10)];


パソコンの調子が悪く、返信が遅くなりました。
 
al7bar:

EAコードを見てください、原因がわかりません...。初回起動時はすぐに取引できますが、終了後は次の端末の再起動、またはEAを取引できるようにするon/offまで動作しなくなります...Gann 2.0インジケータで動作します。

明らかなロジックエラーは見当たりません。コードを順次印刷してください。取引手順はチケット変数の値に連動しています。まず、その変化をトレースする。また、グローバル変数"TRADECONTEXT "の値に 注意してください - その値は0でなければなりません。
 
TarasBY:

この機能により、ある商品の取引情報(注文に連動しない場合、例えば注文を出す前)と、同じであるが特定の注文に連動する場合(注文に付随する場合)を取得することができます。機能の使いやすさを考慮し、デフォルト値が使用される。fi_Ticketの 負の値は、トレードライブラリの初期化時に使用されます。

追伸:そしてまず、変数名、正確にはその接頭辞に注目してください。bs_Symbolのような初期値bを 持つ変数は、ライブラリからグローバルに宣言されます。ほとんどのグローバル変数は、b-PSI@Baseで宣言されています。


イゴール それはわかります。しかし、私が理解したところでは、あるシンボルのマーケット情報を得るためには、注文とリンクさせる必要は全くないのです。楽器があれば、オーダーは必要ないのですが...。全く必要ない。結局のところ、マーケット情報を得るためには、商品名だけが必要なのです。そう思いませんか?

私が質問していたこの変数bs_Symbolはb-PSY@Base.mqh、 ここに文字列が含まれていることが最初に記載されています。

  bs_Symbol,                            // текущий инструмент

しかし、何も割り当てられていない。それから。

if (fs_Symbol != bs_Symbol || fi_Ticket < 0)

という表現があります。

fs_Symbol != bs_Symbol

fs_Symbol != 0 と理解すべきなのでしょうか?

TarasBY:

追伸:そしてまず、変数名、正確にはその接頭辞に注意してください。bs_Symbolのような初期値bを 持つ変数は、ライブラリからグローバルに宣言されます。ほとんどのグローバル変数は、b-PSI@Baseで宣言されています。


ふむ、私は通常、グローバル変数を 表すのにg_を 使いますが(globalという 単語から)、ローカル変数を表すのにl(例えばli_cnt)を使うのでしょうか?
 

友よ! EAの微調整を手伝ってほしい。

ある条件下で注文を出すコードがあります。int start() のボディに配置されているため、条件の実行は毎ティック行うことができる。

必要です。

1.条件の実行(および注文の開始)の後、新しい注文の開始のために 一時停止する必要があります、n個の バーのために一時停止します。例えば、Expert AdvisorがタイムフレームM30で、3時間経過する必要がある場合、一時停止は6バーでなければなりません。

2.ストラテジーテスターで プログラムが動作するはずです。

どのようなコードが必要ですか?そして、どこに挿入するのが正解なのか。

int start()
  { 
   ...

   if (...)                                                          //условие
      {
       OrderSend(Symbol(),OP_BUY,lot,Ask,0,0,0,"Order BUY",0,0);     //открытие ордера
       ...
      }

   ...
  }
 
hoz:


イゴール それはわかります。しかし、要は、ある商品の相場情報を得るためには、注文と連動させる必要は全くないということだと理解しています。楽器があれば、オーダーは必要ないのですが...。全く必要ない。結局のところ、マーケット情報を得るためには、商品名だけが必要なのです。そう思いませんか?

私が質問していたこの変数bs_Symbolはb-PSY@Base.mqh、 ここに文字列が含まれていることが最初に記載されています。

しかし、何も割り当てられていない。それから。

という表現があります。

fs_Symbol != 0 と理解すべきなのでしょうか?


ふむ、通常、グローバル変数を表すには(グローバルという 言葉から)g_を 使い、ローカルを表すにはl(例:li_cnt)を使うのだが......?

まだまだ学ぶべきことがたくさんありますね。今のところ、あなたの想定は当たっていません。私の関数は、特にfGet_MarketInfo()のように、同時に異なる目的を果たすことができます(コード自体を減らすために)。すべてが繰り返し考え抜かれ、何も変える必要がないのです

例えば、EA本体でグローバル変数を 宣言し、この変数をリンク先のライブラリから呼び出してみるという実験から始めてみてください。bs_Symbolのように、bで 始まる接頭辞を持つ変数名に結果を結びつけてみてください。

追伸:私はチェックされる必要はありません。私の図書館を利用するかしないかです。もし何か(私のライブラリの一部)が正しく動作しない場合は、私に知らせてください、私はそれを修正します。そして、「なぜ、そのような仕組みになっているのか?- 自明性は表面にはない」ので、もっと知識が必要です。

 
TarasBY:

まだまだ学ぶべきことがたくさんありますね。今のところ、あなたの想定は当たっていません。私の関数は、特にfGet_MarketInfo()のように、同時に異なる目的を果たすことができます(コード自体を減らすために)。すべてが繰り返し考え抜かれ、何も変える必要がないのです

そこにあるものは理解できる。しかし、なぜこのような実装になっているのか、その理由は明らかではありません。

TarasBY:

例えば、EA本体でグローバル変数を宣言し、この変数をリンク先のライブラリから呼び出してみる、という実験から始めてみてください。bs_Symbolのように、bで 始まる接頭辞を持つ変数名に結果を結びつけてみてください。

いずれにせよ、ライブラリーをそのまま使うことはできません。つまり、すべてがそこに束縛されているのです。あらゆる機能が他のパックに...

TarasBY:

追伸:私はチェックされる必要はありません。私の図書館を利用するかしないかです。もし何か(私のライブラリの一部)が正しく動作していない場合は、私に知らせてください、修正します。そして、「なぜ、そのような仕組みになっているのか?- 自明性は表面には現れない」ので、もっと知識が必要です。

別にテストしたつもりはないんですけどね...。実際、非常に有能に書かれていることは間違いない。ただ、すべてを理解できているわけではないので、「そうは思わない」と言ったのですが......。私は見て、私は考えて...でも、すべてを理解しているわけではありません。だから聞いたんです。

P.S. bs_Symbolで、私はまだそれを得ることができません。