[ARCHIVE] フォーラムを散らかさないように、どんなルーキーでも質問してください。プロフェッショナルは、通り過ぎないでください。Nowhere without you - 3. - ページ 546

 

EAには以下のブロック(Event Counter)があります。

if (isCloseLastPosByStop()==True) //最後の注文がStopで決済された場合

{
N=N+1です。
Alert(N, " moose");
} else N=0;

質問:データを画面に表示するのではなく、ファイル(エクセル)に書き込む方法を教えてください。

 
Dimka-novitsek:

こんにちは、私は1つのループで注文を選択し、私は最後の順序を通過し、それを覚えているので、チケット= OrderTicket()することができますどのように教えてください。

この場合、2番としましょう。 少し後 if (チケット>-1){。
OrderSelect(ticket,SELECT_BY_TICKET,MODE_HISTORY);

と、よくエラー4105 - order not selectedが出ます。


それは、まだ注文が締め切られていないからです。MODE_HISTORYではなく、MODE_TRADESのままです。
 

for(  i=0;i<=OrdersHistoryTotal();i++){
    OrderSelect(i ,SELECT_BY_POS,MODE_HISTORY);
     if (OrderMagicNumber( )== magic) { if(OrderSymbol()== Symbol()) {





 current = OrderOpenTime();  Alert ( " current = OrderOpenTime(); ",  current);Alert ( " max ", max );
      
      if (current > max) 
      {                    
         max = current;      
         ticket = OrderTicket();   Alert ( " ticket = OrderTicket();  ", ticket );
      }}}}


       if (ticket>-1){
      OrderSelect( ticket,SELECT_BY_TICKET,MODE_HISTORY);Alert ("SELL Select error HISTORYticket ", GetLastError( )  ) ;

まさか!?なぜダメなのか?オーバーシュート時に未決済の注文がなかった!?理解できないかもしれない。

検索サイクルも履歴に残る!そこで、int ticket変数に代入しているのです

そしてそれは、失礼ながら、2012.02.04 11:28:47 2011.12.06 16:35 GMT EURUSD,M30:Alert: SELL Select error HISTORYticket 4105.

MODE_HISTORYからMODE_TRADESになるとき?

そして何より、ヒストリー上で同じオーダーをオーダーセレクトの助けを借りて選択すると、最初に選択されるのです!そうでなければ、作業できません。理屈じゃない!!ショックだ...。




 
Dimka-novitsek:

まさか!?なぜダメなのか?オーバーシュート時に未決済の注文がなかった!?理解できないかもしれない。

検索サイクルも履歴に残る!そこで、int ticket変数に代入しているのです

そしてそれは悪態をつく、失礼、2012.02.04 11:28:47 2011.12.06 16:35 GMT EURUSD,M30: アラート: SELL セレクトエラー HISTORYticket 4105

MODE_HISTORYからMODE_TRADESに移行するとき?


ticket=-1;
for(  i=0;i<OrdersHistoryTotal();i++){
    if (OrderSelect(i ,SELECT_BY_POS,MODE_HISTORY));{
     if (OrderMagicNumber( )== magic) { if(OrderSymbol()== Symbol()) {





 current = OrderOpenTime();  Alert ( " current = OrderOpenTime(); ",  current);Alert ( " max ", max );
      
      if (current > max) 
      {                    
         max = current;      
         ticket = OrderTicket();   Alert ( " ticket = OrderTicket();  ", ticket );
      }}}}}


       if (ticket>-1){
      OrderSelect( ticket,SELECT_BY_TICKETJ ,MODE_HISTORY);Alert ("SELL Select error HISTORYticket ", GetLastError( )  ) ;
冒頭に1行追加 し、次の2行を修正しました。
 
ありがとうございます!!!
 

EAにストップロスを挿入するのを助ける

お願いします

ファイル:
my_1.mq4  10 kb
 
オープンポジション、すなわちエクイティを考慮して最大許容ロットを計算する関数を教えてください。 標準の関数ではリスクは計算されますが、取引がある場合、それを開くための資金が不足しています。
 
T-G:
オープンポジション、すなわちエクイティを考慮して最大許容ロットを計算する関数を教えてください。 標準の関数ではリスクは計算されますが、取引がある場合、それを開くための資金が不足しています。


最も単純なケースでは、このようになります。

double Klots = 0.1; //коэфф. риска (определяет желаемый размер лота от максимально возможного в данный момент.)

Lots=NormalizeDouble(Klots*AccountFreeMargin()/MarketInfo(Symbol(),MODE_MARGINREQUIRED),2);Lots=MathMax(MarketInfo(Symbol(),MODE_MINLOT),Lots);
 

みんな、この質問についてアドバイスしてくれないか?

crenfxのジグザグバックラッシュの最大サイズを求めるスクリプトはこちらです。

#property show_inputs

extern int MinPips = 100;
extern datetime StartTime = D'2011.03.24';
extern datetime EndTime = D'2011.12.31';

#define MAX_POINTS 10000

// Заполняет массив размерами колен ЗигЗага с условием колена >= MinPips пунктов
int GetZigZagData( int MinPips, datetime& StartTime, datetime& EndTime, int& Data[] )
{
  bool FlagUP = TRUE;
  int Pos = iBarShift(Symbol(), Period(), StartTime);
  int PosEnd = iBarShift(Symbol(), Period(), EndTime);
  int Max = High[Pos] / Point + 0.1;
  int Min = Low[Pos] / Point + 0.1;
  int Count = 0;
  int PriceHigh, PriceLow;
 
  StartTime = Time[Pos];
  EndTime = Time[PosEnd];
  
  ArrayResize(Data, MAX_POINTS);

  Pos--;
  
  while (Pos >= PosEnd)
  {
    PriceHigh = High[Pos] / Point + 0.1;
    PriceLow = Low[Pos] / Point + 0.1;   

    if (FlagUP)
    {
      if (PriceHigh > Max)
        Max = PriceHigh;
      else if (Max - PriceLow >= MinPips)
      {
        Data[Count] = Max - Min;
        Count++;
        
        FlagUP = FALSE;
        Min = PriceLow;
      }
    }
    else
    {
      if (PriceLow < Min)
        Min = PriceLow;
      else if (PriceHigh - Min >= MinPips)
      {
        Data[Count] = Max - Min;
        Count++;
        
        FlagUP = TRUE;
        Max = PriceHigh;
      }
    }
    
    Pos--;
  }
  
  ArrayResize(Data, Count);
    
  return(Count);
}

void start()
{
  int ZigZagData[];
  int Amount = GetZigZagData(MinPips, StartTime, EndTime, ZigZagData);
  
  ArraySort(ZigZagData);
  
  Print("На интервале " + TimeToStr(StartTime) + " - " + TimeToStr(EndTime) +
        " максимальное безоткатное (> " + MinPips +
        " пунктов) движение " + ZigZagData[Amount - 1] + " пунктов.");
        
  return;
}

M5で計測器のチャートに投げる - デフォルトのタイムフレームで問題なく動作します。

extern datetime StartTime = D'2011.03.24';
extern datetime EndTime = D'2011.12.31';

は,アルパリオフィスでF2で読み込んだときのシンボルの履歴の最大深さです-確認したところ,つまりクライアント端末の「エキスパート」タブの内容のようです-本当だったようです.

私のEAで同じスクリプトデザインを同じM5チャート期間の同じ時間間隔に使用すると、正しくカウントされません。

を計算すると、全く異なる(スクリプトより小さい)数値や0が計算されます。何がエラーなのか、あるいは何らかの履歴の不整合なのでしょうか。ありがとうございます。

例えば、フェイルセーフを見つけるための推定時間が経過した後、owlでテスターを開始した場合、理論上はすべて正常で、スクリプトとowlの数値は同じはずなのですが...。何がエラーになるのでしょうか?

 

このスクリプトをフクロウにチャージする方法です。

extern string A3 = "Расчет безотката";
//РАСЧЕТ БЕЗОТКАТА ДЛЯ РАССТАВЛЕНИЯ ОРДЕРОВ С ЗАДАННЫМ ШАГОМ
extern int MinPips = 100;
extern datetime StartTime = D'2011.03.24';
extern datetime EndTime = D'2011.12.31';
#define MAX_POINTS 1000000

//extern double grid = 1000;          // размер безотката в пунктах



//+------------------------------------------------------------------+
//| Старт робота                                                     |
//+------------------------------------------------------------------+

int init()
{   
       
  //------------------     ШАГ СЕТКИ   ---------------------------------------------------------------------------------------

 //Pipstep = grid/Max_Iteration;
 //Pipstep = NormalizeDouble(Pipstep,0);  
 // СЧИТАЕМ БЕЗОТКАТ
    int ZigZagData[];
    int Amount = GetZigZagData(MinPips, StartTime, EndTime, ZigZagData);
  
    ArraySort(ZigZagData);
  
    Print("На интервале " + TimeToStr(StartTime) + " - " + TimeToStr(EndTime) +
        " максимальное безоткатное (> " + MinPips +
        " пунктов) движение " + ZigZagData[Amount - 1] + " пунктов.");        

  
   
    return (0);
}

...
...

// Заполняет массив размерами колен ЗигЗага с условием колена >= MinPips пунктов
int GetZigZagData( int MinPips, datetime& StartTime, datetime& EndTime, int& Data[] )
{
  bool FlagUP = TRUE;
  int Pos = iBarShift(Symbol(), Period(), StartTime);
  int PosEnd = iBarShift(Symbol(), Period(), EndTime);
  int Max = High[Pos] / Point + 0.1;
  int Min = Low[Pos] / Point + 0.1;
  int Count = 0;
  int PriceHigh, PriceLow;
 
  StartTime = Time[Pos];
  EndTime = Time[PosEnd];
  
  ArrayResize(Data, MAX_POINTS);

  Pos--;
  
  while (Pos >= PosEnd)
  {
    PriceHigh = High[Pos] / Point + 0.1;
    PriceLow = Low[Pos] / Point + 0.1;   

    if (FlagUP)
    {
      if (PriceHigh > Max)
        Max = PriceHigh;
      else if (Max - PriceLow >= MinPips)
      {
        Data[Count] = Max - Min;
        Count++;
        
        FlagUP = FALSE;
        Min = PriceLow;
      }
    }
    else
    {
      if (PriceLow < Min)
        Min = PriceLow;
      else if (PriceHigh - Min >= MinPips)
      {
        Data[Count] = Max - Min;
        Count++;
        
        FlagUP = TRUE;
        Max = PriceHigh;
      }
    }
    
    Pos--;
  }
  
  ArrayResize(Data, Count);
    
  return(Count);
}

全部同じに見えるのですが、何が間違いなのでしょうか?