[警告は閉鎖されました!】フォーラムを乱雑にしないために、どんな初心者の質問でも。プロフェッショナルは、通り過ぎないでください。あなたなしでは、どこにも行けない。 - ページ 485

 
SLで、EAは同じタイプの注文を開き、TPで反対のタイプの注文を開くべきです!
しかし、なぜかEAが間違ったタイプの注文を開くことが多いのです



//+------------------------------------------------------------------+
//|                                                      Kogalym.mq4 |
//|                                                               TO |
//|                             http://forex-tradexperts-to.narod.ru |
//+------------------------------------------------------------------+
#property copyright "TO"
#property link      "http://forex-tradexperts-to.narod.ru"

//--------------------------------------------------------------------
extern int  stoploss    = 50,
            takeprofit  = 50;
extern double      Lot=1;
extern double Martin_Koef = 1.6;
//--------------------------------------------------------------------
int init()
{
   OrderSend(Symbol(),OP_SELL,Lot,Bid,3,NormalizeDouble(Ask + stoploss*Point,Digits),
                        NormalizeDouble(Bid - takeprofit*Point,Digits)," ",777,Blue);
}
//--------------------------------------------------------------------
int start()
{   for (int i=0; i<OrdersTotal(); i++){   
      if (OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==true){
         if (OrderSymbol()==Symbol()){
         Lot = OrderLots();return;}}}
            if (Lot==0) return;
       
  if(OrderType() == OP_SELL)
   if(OrderProfit()>0) OrderSend(Symbol(),OP_BUY , getLot(),Ask,3,NormalizeDouble(Bid - stoploss*Point,Digits),
                                    NormalizeDouble(Ask + takeprofit*Point,Digits)," ",777,Blue); 
 else  OrderSend(Symbol(),OP_SELL,getLot(),Bid,3,NormalizeDouble(Ask + stoploss*Point,Digits),
                                   NormalizeDouble(Bid - takeprofit*Point,Digits)," ",777,Blue);

  if(OrderType() == OP_BUY) 
   if(OrderProfit()>0)OrderSend(Symbol(),OP_SELL,getLot(),Bid,3,NormalizeDouble(Ask + stoploss*Point,Digits),
        NormalizeDouble(Bid - takeprofit*Point,Digits)," ",777,Blue);
else  OrderSend(Symbol(),OP_BUY ,getLot(),Ask,3,NormalizeDouble(Bid - stoploss*Point,Digits),
                                    NormalizeDouble(Ask + takeprofit*Point,Digits)," ",777,Blue);
  
                                     
       
   return(0);
}
//-----------------------------------------------------------------

double getLot()
{
   if(OrdersHistoryTotal()==0)return(1);
   // ищем самый последний закрытый ордер
   datetime time=0;
   int i;
   int ticket=-1;
   for(i=OrdersHistoryTotal()-1;i>=0;i--)
   {
      if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY))
      {
         if(OrderSymbol()==Symbol())
         {
            if(OrderCloseTime()>time)
            {
               time=OrderCloseTime();
               ticket=OrderTicket();
            }
         }
      }
   }
   if(OrderTicket()!=ticket)OrderSelect(ticket,SELECT_BY_TICKET);
   if(OrderProfit()<=0) return(NormalizeDouble(OrderLots()*Martin_Koef,2));
   if(OrderProfit()>0)return(1);
   //-----
}
どこが間違いか教えてください!
 
Kogalym писал(а)>>
SLで同じタイプの注文を、TPで反対のタイプの注文を出すこと。
しかし、なぜかEAが間違ったタイプの注文を開くことが多いのです



どこが間違いなのか、教えてください。

if(OrderType() == OP_SELL)
   if(OrderProfit()>0)
そのための選別なのです。
 
このインジケータがEAに適しているかどうか知っている人、私はそれが著者によって適用されている一つの戦略を見つけた、それはEAに書き込むことができ、それを行う方法、例えば、私に例を示すことができます。ヒストグラムが緑色で、線がヒストグラムより下にあれば、買いシグナルになることがわかりました。セルも同様です。
ファイル:
 
PapaYozh >>:


какова размерность массива x10 ?

10?
Тогда надо так переписать:

и не понятно, что именно вы хотите получить в массивах MAX и MIN

もう一度説明します :)

MACD列のすべての値を含む配列が存在する。

それらの値から十数個の値を(順番に)取り出して、その中から最大値を探し、それぞれインジケータに描画する、ということを最後まで行う必要があります。

ここでもう一度、コードを見てみましょう。

for(i=0; i<50; i=i+10) //общий цикл для всех значений МАКД, шаг 10
       {
         int k = i;
         for(k=i; k<i+10; k++) // цикл внутри десятки значений, шаг 1
             {       
              x10[k] = MACD[k];// массив десяток
             }
         int IndexMAX = ArrayMaximum(x10); // найден индекс максимального значения внутри десятки 
         int IndexMIN = ArrayMinimum(x10); // --//--   
         MAX[k] = MACD[IndexMAX]; // Рисуем найденное максимальное значение внутри десятки на k баре
         MIN[k] = MACD[IndexMIN];
       }

私の見るところ、10を含む配列のインデックスと、MAKD値を含むメインの配列のこの値のインデックスが一致しないため、描画されないのです。

つまり、メインループでカウンタが例えば 30 に到達し、サブサイクルで 30-31-32...39 と進むと、関数 Arraymaximum(x10) がそれを見つけ、IndexMAX に HIS (x10) の配列の序数を正確に書きます。どうしたらいいのかわからない......。

 
Noterday писал(а)>>

もう一度説明します :)

MACD列のすべての値を含む配列が存在する。

その値を全部(順番に)十数個取って、その中から最大値を探して、インジケータに描いて、ということを最後までやらないといけない。

ここでもう一度、コードを見てみましょう。

私の見るところ、10を含む配列のインデックスと、MAKD値を含むメインの配列のこの値のインデックスが一致しないため、描画されないのです。

つまり、メインループでカウンタが例えば 30 に到達し、サブサイクルで 30-31-32...39 と進むと、関数 Arraymaximum(x10) がそれを見つけ、IndexMAX に HIS (x10) の配列の序数を正確に書きます。どうしたらいいのかわからない......。


インジケーターのコードを全て表示する
 
Vinin >>:


Весь код индикатора покажи
//+------------------------------------------------------------------+
//|                                                  Custom MACD.mq4 |
//|                      Copyright © 2004, MetaQuotes Software Corp. |
//|                                                        Alexander |
//+------------------------------------------------------------------+
#property  copyright "none"
#property  link      "none"
//---- indicator settings
#property  indicator_separate_window
#property indicator_buffers 4

#property indicator_color1 MediumPurple
#property indicator_color2 MediumPurple
#property indicator_color3 Green
#property indicator_color4 Red

#property indicator_width1 1
#property indicator_width2 1

//---- indicator parameters
extern int FastEMA=12;
extern int SlowEMA=26;
extern int SignalSMA=9;
//---- indicator buffers
double     MACD[];
double     SMACD[];
double     MAX[];
double     MIN[];
double     x10[];

//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init()
  {
   IndicatorBuffers(5);
   
   SetIndexBuffer(0,MACD);
   SetIndexBuffer(1,SMACD);
   SetIndexBuffer(2,MAX);
   SetIndexBuffer(3,MIN);
   SetIndexBuffer(4,x10);
   
   SetIndexStyle(0,DRAW_HISTOGRAM);
   SetIndexStyle(1,DRAW_LINE);
   
   SetIndexStyle(2,DRAW_ARROW);
   SetIndexArrow(2,119);
   
   SetIndexStyle(3,DRAW_ARROW);
   SetIndexArrow(3,119);
   
   SetIndexStyle(4,DRAW_NONE);
   
   SetIndexDrawBegin(1,SMACD);
   IndicatorDigits(Digits+2);

   IndicatorShortName("MACD("+FastEMA+","+SlowEMA+","+SignalSMA+")");
   SetIndexLabel(0,"MACD");
   SetIndexLabel(1,"Signal");

   return(0);
  }
//+------------------------------------------------------------------+
//| Moving Averages Convergence/Divergence                           |
//+------------------------------------------------------------------+
int start()
  {
   int limit;
   int counted_bars=IndicatorCounted();

   if(counted_bars>0) counted_bars--;
   limit=Bars-counted_bars;

   for(int i=0; i<limit; i++)
      MACD[i]=iMA(NULL,0,FastEMA,0,MODE_EMA,PRICE_CLOSE,i)-iMA(NULL,0,SlowEMA,0,MODE_EMA,PRICE_CLOSE,i);

   for(i=0; i<limit; i++)
      SMACD[i]=iMAOnArray(MACD,Bars,SignalSMA,0,MODE_SMA,i);
      
      
   for(i=0; i<limit; i=i+10)
       {
         int k = i;
         for(k=i; k<i+10; k++)
             {       
              x10[k] = MACD[k];// массив десяток
             }
         int IndexMAX = ArrayMaximum(x10);
         int IndexMIN = ArrayMinimum(x10);    
         MAX[k] = MACD[IndexMAX];
         MIN[k] = MACD[IndexMIN];
       }
   return(0);
  }
//+------------------------------------------------------------------+

int deinit()
{   
return(0);
}
 
Noterday писал(а)>>

もう一度説明します :)

こういう風に書いたつもりなんだろうけど。

for(i=0; i<limit; i+=10) //общий цикл для всех значений МАКД, шаг 10
       {
         int k;
         for(k=0; k<10; k++) // цикл внутри десятки значений, шаг 1
             {       
              x10[k] = MACD[i+k];// массив десяток
             }
         int IndexMAX = ArrayMaximum(x10); // найден индекс максимального значения внутри десятки 
         int IndexMIN = ArrayMinimum(x10); // --//--   
         MAX[k] = x10[IndexMAX]; // Рисуем найденное максимальное значение внутри десятки на k баре
         MIN[k] = x10[IndexMIN];
       }
 
Noterday писал(а)>>


あなたの目標は何ですか?
さて、何を手に入れたいか。数十に分解するのは無意味です。常に時間を移動しているのです。

 
PapaYozh >>:

мне кажется, Вы хотели написать вот так:

描画されない :((.

s.w. k=0 完成しました :)

 
Vinin >>:


А какую цель преследуешь?
Ну, что хочешь получить. Разбивать на десятки бесмысленно. Они все время передвигаются во времени.

10本ごとに最大値を表示させたいのですが・・・。