目利きの方に質問です - ページ 2

 

ここにコードのバリエーションがありました。

どのように私のEAに挿入することができるのでしょうか?

//+----------------------------------------------------------------------------+
//|  Возвращает номер бара открытия последней позиции или -1.                  |
//|  Параметры:                                                                |
//|    sym - наименование инструмента  ("" - текущий символ)                   |
//|    tf  - таймфрейм                 ( 0 - текущий таймфрейм)                |
//|    op  - операция                  (-1 - любая позиция)                    |
//|    mn  - MagicNumber               (-1 - любой магик)                      |
//+----------------------------------------------------------------------------+
int NumberOfBarOpenLastPos(string sym="", int tf=0, int op=-1, int mn=-1) {
  datetime oot;
  int      i, k=OrdersTotal();
 
  if (sym=="") sym=Symbol();
  for (i=0; i<k; i++) {
    if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
      if (OrderSymbol()==sym) {
        if (OrderType()==OP_BUY || OrderType()==OP_SELL) {
          if (op<0 || OrderType()==op) {
            if (mn<0 || OrderMagicNumber()==mn) {
              if (oot<OrderOpenTime()) oot=OrderOpenTime();
            }
          }
        }
      }
    }
  }
  return(iBarShift(sym, tf, oot, True));
}
 
Kostay:

エキスパートアドバイザーで奇妙なことが起こっています。それは、ポジションの閉鎖で動作していません。その結果、修正版とはいえ、すべてが同じ問題で負けているのです

修正しました、お試しください。

extern double Lots = 0.1;

//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
int start() {
   double P_up0,P_down0,P_up1,P_down1;
   double st_m1, st_s1, st_m2, st_s2,Pivot,ma_s1;
   int i, cnt, ticket, total;
   bool flag=true;

   if(Bars<100) {
      Print("bars less than 100");
      return(0); 
   }
// Проверяем стоит ли открываться
   
   cnt=OrdersHistoryTotal()-1;
   for(i=cnt;i>=0;i--) {
      if(!OrderSelect(i, SELECT_BY_POS, MODE_HISTORY )) continue;
      if(OrderOpenTime()>=Time[0]) { // Time[0] - если позиция открывается на нулевом баре текущего символа
         flag=false;
         break;
      }
   }
   cnt=OrdersTotal()-1;
   for(i=cnt;i>=0;i--) {
      if(!OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) continue;
      if(OrderOpenTime()>=Time[0]) { // Time[0] - если позиция открывается на нулевом баре текущего символа
         flag=false;
         break;
      }
   }
   
//-----------------------------------------------
   P_up0=iCustom(0,0,"Ценовой канал",11,0,0);
   P_down0=iCustom(0,0,"Ценовой канал",11,1,0);
   P_up1=iCustom(0,0,"Ценовой канал",11,0,1);
   P_down1=iCustom(0,0,"Ценовой канал",11,1,1);
   st_m1=iStochastic(0,0,10,3,3,MODE_SMA,0,MODE_MAIN,1);
   st_s1=iStochastic(0,0,10,3,3,MODE_SMA,0,MODE_SIGNAL,1);
   st_m2=iStochastic(0,0,10,3,3,MODE_SMA,0,MODE_MAIN,2);
   st_s2=iStochastic(0,0,10,3,3,MODE_SMA,0,MODE_SIGNAL,2);
   Pivot=iCustom(0,0,"Pivot",0,1);
   ma_s1=iMA(0,0,4,0,MODE_SMA,PRICE_CLOSE,1);
//задали все данные 

// Проверка свободной маржи
   if(AccountFreeMargin()<(1000*Lots)) {
      Print("We have no money. Free Margin = ", AccountFreeMargin());
      return(0); 
   }
   total=OrdersTotal();
// Условие открытие позиции BUY
   if(st_m2>st_s2&&st_m1>st_s1&&st_m2<25&&Pivot<ma_s1) {
      if((total>0) || (!flag)) return(0);
      ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,3,0,0,"",0,0,Green);
      if(ticket>0) {
         if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES))
            Alert("Покупка: ",OrderOpenPrice()); 
      }  else Alert("ошибка:по цене ",OrderOpenPrice()); 
      return(0); 
   }
      
// Условие открытие позиции SELL
   if(st_m2<st_s2&&st_m1<st_s1&&st_m2>75&&Pivot>ma_s1) {
      if((total>0) || (!flag)) return(0);
      ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,3,0,0,"",0,0,Red);
      if(ticket>0) {
         if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES))
            Alert("Покупка: ",OrderOpenPrice()); 
      }  else Alert("ошибка:по цене ",OrderOpenPrice()); 
      return(0); 
   }
  
   for(i=cnt;i>=0;i--) {
      OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES);
      if(OrderType()<=OP_SELL && OrderSymbol()==Symbol()) {
         if(OrderType()==OP_BUY) {// длинная позиция открыта
// условие закрытие длинной позиции
            if(P_down1>P_down0) {
               OrderClose(OrderTicket(),OrderLots(),Bid,3,Violet); 
               return(0); 
            }
         }  else {
// условие закрытия короткой позиции
               if(P_up1<P_up0) {
                  OrderClose(OrderTicket(),OrderLots(),Ask,3,Violet); 
                  return(0); 
               }
            }
      }
   }
   return(0);
}
 

こんにちは。

ニューラルネットワークを プログラミングする際、次のような問題が発生しました。

配列がある

double X[3];
   X[0]=1;
   X[1]=2;
   X[2]=3;
   X[3]=4;

Comment(X[3]);

テストすると、4ではなく0になってしまいます。同じことが2次元配列で起きているのですが、どうしたらいいのでしょうか?

また、この機会に2つ目の質問をします。私が理解するところでは、mql4では、変数を乱数に割り当てるための特定の範囲を設定することはできないのでしょうか?

Delphiでは、次のようになります。

ランダム化する。

i:=Random(10); // 同じく0から10までの範囲

 
Chris_Brown >> :

...配列があるんです。

テストすると、4ではなく0が表示されます。2次元配列でも同じことが起こりますが、どうしたらよいでしょうか?

配列は単純で、次元[3]を定義し、4つ目の足りないセルを呼び出すだけです。

double X[4];と書けば、すべてうまくいく。

 
granit77 >> :

配列の場合は簡単で、次元[3]を定義しますが、4番目の足りないセルを呼び出すのです。

double X[4];と書けば、すべてうまくいく。

ありがとうございます、試してみますが、ランダムはどうなんでしょうか?

 

また、2次元の配列、4×9の行列があり、各要素に0.1という値が割り当てられて いるとしたら、それくらいでいいのでしょうか。


int i, j;

double W[4][9];
   for ( i=0; i<=3; i++)
   for ( j=0; j<=8; j++)
       W[ i][ j]=0.1; 
 
Chris_Brown >> :

また、2次元の配列、4×9の行列があり、各要素に値0.1を割り当てると、次のようになりますね?

動作するはずです。手間を惜しまず、コメントで行列全体を一行ずつ表示すると、結果が見えてきます。

ちなみに、このコメントを関数にして、配列の中身をチェックするのに使うこともできます。

そして、ランダム性についてですが、私はパスします。通りかかったら、間違いがあった。:))

 
Chris_Brown писал(а)>>

ありがとうございます、試してみますが、ランダムはどうなんでしょう?

double i=MathRand()/32767.0*10; 
ヘルプはそこにある
 
Chris_Brown писал(а)>>

また、4×9の2次元配列の行列があり、各要素に0.1という値が割り当てられているとしたら、次のようなものになるでしょうか。

使用可能

intArrayInitialize() double &array[], double value).
数値配列の全要素を同じ値に設定します。初期化された要素の数を返す。

 
Chris_Brown писал(а)>>

また、2次元の配列、4×9の行列があり、各要素に0.1という値を割り当てた場合、次のように動作するでしょうか。

int i, j;

double W[4][9];
   for ( i=0; i<=3; i++)
   for ( j=0; j<=8; j++)
       W[ i][ j]=0.1; 

うまくいくのですが、このような書き方でなければなりません。

int i, j;

double W[4][9];

   for ( i=0; i<4; i++)
      for ( j=0; j<9; j++)
         W[ i][ j]=0.1;