[АРХИВ]Любой вопрос новичка, чтоб не захламлять форум. Профи, не проходите мимо. Без вас никуда - 5. - страница 424

 
gyfto:

Ну, по идее, если дополнительные индикаторные буфера объявлять самостоятельно, а дальше трендовыми линиями, то работать будет...

Тогда почему в документации сказано, что 
Количество буферов не может превышать 8
 Вот тут непонятно. Там же не написано, что количество основных буферов.. а не всех. Сказано, что кол-во буферов и всё. Значит я читая, понимаю, что по ходу это должно распостраняться на общее кол-во буферов заданного индикатора.
 
gyfto:

Нет, я говорю про ObjectCreate(), там же номер окна нужно задавать. Я и показал, как задавать, если это подокно (то есть не ноль, которое главное окно).

Так у Вас там при создании объекта параметр функции - WindowOnDropped, а это уже вроде как главное окно относительно. Или главное окно самое левое из окон в терминале?
 

Здравствуйте! Не могу понять почему не удаляются ордера buystop.

extern double Lots       =0.01;
extern int    Magic      =333;

extern int    StopLoss      = 100;      // Размер фиксированного стопа
extern int    TakeProfit    = 100;       // Размер фиксированного тэйка
extern int    DistanceSet   = 160;      // Расстояние от рынка
extern int    Slippage      = 3;       // Проскальзывание цены
color  clOpenBuy     = LightBlue;    // Цвет ордера BuyStop
color  clOpenSell    = LightCoral;   // Цвет ордера SellStop
string Name_Expert   = "Scalp";

string Symb;
bool Work=true;

extern bool   UseSound       = True;  // Использовать звуковой сигнал
extern string NameFileSound  = "expert.wav";  // Наименование звукового файла
//============================================================================================
int start()
  {
   int
   Total,
   Tip=-1,
   Ticket,
   TicketB,
   TicketS,
   TicketMB,
   TicketMS,
   buys,
   sells,
   mbuys,
   msells;
   double
   OP_PriceSell,
   OP_PriceBuy, 
   Lot,
   Lts,
   Min_Lot,
   Max_Lot,
   Step,
   Free,
   One_Lot,
   Price,
   SL,
   TP,
   TP1,
   PriceB,
   PriceS,
   SLB,
   SLS;
   bool
   Ans  =false,
   Opn_B=false,
   Opn_S=false,
   Cls_B=false,
   Cls_S=false;
//============================================================================================
   // Учёт ордеров
   Symb=Symbol();
   Total=0;
   buys=0;
   sells=0;
   mbuys=0;
   msells=0;                                    
   for(int i=1; i<=OrdersTotal(); i++)
     {
      if (OrderSelect(i-1,SELECT_BY_POS)==true)
        {
         Total++;
         if(OrderType()==OP_BUYSTOP)  buys++;
         if(OrderType()==OP_SELLSTOP) sells++;
         if(OrderType()==OP_BUY)  mbuys++;
         if(OrderType()==OP_SELL) msells++;
         if(OrderType()==OP_BUYSTOP) TicketB=OrderTicket();
         if(OrderType()==OP_SELLSTOP) TicketS=OrderTicket(); 
         Ticket=OrderTicket();
         Tip   =OrderType();
         TP    =OrderTakeProfit();
         Lot   =OrderLots();
        }
     }
//============================================================================================
   // Открытие ордеров
   while(true)                                  
     {
      if (Total==0)            
        {                                      
         star();
        }
      break;                                   
     }
//============================================================================================
  while(true)
     {
      if(Total==2)
        {
         if(msells==1)
           {
            if(buys==1)
              {
               if(OrderType()==OP_BUYSTOP && OrderLots()==Lots)
                 {
                  OrderDelete(Ticket);
                 }
              }
           }
        }
      if(Total==2)
        {
         if(mbuys==1)
           {
            if(sells==1)
              {
               if(OrderType()==OP_SELLSTOP && OrderLots()==Lots)
                 {
                  OrderDelete(Ticket);
                 }
              }
           }
        }
      break;
     }  
//============================================================================================
   return;
  }
//============================================================================================
//+------------------------------------------------------------------+
void star() {
  double ldStop=0, ldTake=0;
  double pAsk=Ask+DistanceSet*Point;
  double pBid=Bid-DistanceSet*Point;

  if (StopLoss!=0) ldStop=pAsk-StopLoss*Point;
  if (TakeProfit!=0) ldTake=pAsk+TakeProfit*Point;
  SetOrder(OP_BUYSTOP, pAsk, ldStop, ldTake);

  if (StopLoss!=0) ldStop=pBid+StopLoss*Point;
  if (TakeProfit!=0) ldTake=pBid-TakeProfit*Point;
  SetOrder(OP_SELLSTOP, pBid, ldStop, ldTake);
}

//+------------------------------------------------------------------+
//| Установка ордера                                                 |
//| Параметры:                                                       |
//|   op     - операция                                              |
//|   pp     - цена                                                  |
//|   ldStop - уровень стоп                                          |
//|   ldTake - уровень тейк                                          |
//+------------------------------------------------------------------+
void SetOrder(int op, double pp, double ldStop, double ldTake) {
  color  clOpen;
  string lsComm=GetCommentForOrder();

  if (op==OP_BUYSTOP) clOpen=clOpenBuy;
  else clOpen=clOpenSell;
  OrderSend(Symbol(),op,Lots,pp,Slippage,ldStop,ldTake,lsComm,0,0,clOpen);
  if (UseSound) PlaySound(NameFileSound);
}

//+------------------------------------------------------------------+
//| Генерирует и возвращает строку коментария для ордера или позиции |
//+------------------------------------------------------------------+
string GetCommentForOrder() {
  return(Name_Expert+" "+GetNameTF(Period()));
}

//+------------------------------------------------------------------+
//| Возвращает наименование таймфрейма                               |
//+------------------------------------------------------------------+
string GetNameTF(int TimeFrame) {
        switch (TimeFrame) {
                case PERIOD_MN1: return("Monthly");
                case PERIOD_W1:  return("Weekly");
                case PERIOD_D1:  return("Daily");
                case PERIOD_H4:  return("H4");
                case PERIOD_H1:  return("H1");
                case PERIOD_M30: return("M30");
                case PERIOD_M15: return("M15");
                case PERIOD_M5:  return("M5");
                case PERIOD_M1:  return("M1");
                default:                     return("UnknownPeriod");
        }
}
//+------------------------------------------------------------------+
 
hoz:

Тогда почему в документации сказано, что 
Количество буферов не может превышать 8
 Вот тут непонятно. Там же не написано, что количество основных буферов.. а не всех. Сказано, что кол-во буферов и всё. Значит я читая, понимаю, что по ходу это должно распостраняться на общее кол-во буферов заданного индикатора.

Нееееа,я не про индикаторные буферы говорю, а про сэмулированные индикаторные буферы. А там ArrayResize(CustomBuffer, Bars) в обёртке из IndicatorCounted(), а концы крайних правых трендовых линий должны перерисовываться по биду.

hoz:

Так у Вас там при создании объекта параметр функции - WindowOnDropped, а это уже вроде как главное окно относительно. Или главное окно самое левое из окон в терминале?
Нет, я тоже путался сначала. Например, у нас открыто два графика, еврена и золото. Так вот, они оба имеют индекс ноль. Но если у них появляются подокна, то они нумеруются с единицы. Например, я кинул три индюка на график евренны, два на золото, и все пять с #property separate_window и все разных подокнах. Тогда у еврены будут номера окон 0, 1, 2, 3, а у золота 0, 1, 2.
 

У меня вопрос. Мозги уже закипают, чесное слово. Если можете - помогите.

int n=1, limit=3;
double result;//или int result, что не столь сейчас важно
double temp[];
int start(){
        for(int slow=10; slow<=10*limit; slow++){
                for(int fast=10; fast<=slow; fast++){
                        for(int period=1; period<=slow/10; period++){
                                n++; Print(n-1, ": ", slow-9, ", ", fast-9, ", ", period);
                                //здесь идёт тестирование машки с параметрами slow, fast, period, а результаты тестирования заносим в массив:
                                ArrayResize(temp,n); temp[n-1]=result;
                        }
                }
        }
        //и находим максимальный результат:
        int max=ArrayMaximum(temp);
   return(0);
}

Теперь вопрос: как по max (который у нас позиция элемента в массиве) восстановить значения slow, fast, period? Порядок заноса значений в temp[] приведён в Print(). В limit я поставил 3, но там может стоять любое число. Вот первые 77 значений (limit=2):

            10: 4, 4, 1  20: 6, 5, 1  30: 8, 2, 1  40: 9, 4, 1   50: 10, 5, 1   60: 11, 3, 1  70: 11, 8, 1
1: 1, 1, 1  11: 5, 1, 1  21: 6, 6, 1  31: 8, 3, 1  41: 9, 5, 1   51: 10, 6, 1   61: 11, 3, 2  71: 11, 8, 2
2: 2, 1, 1  12: 5, 2, 1  22: 7, 1, 1  32: 8, 4, 1  42: 9, 6, 1   52: 10, 7, 1   62: 11, 4, 1  72: 11, 9, 1
3: 2, 2, 1  13: 5, 3, 1  23: 7, 2, 1  33: 8, 5, 1  43: 9, 7, 1   53: 10, 8, 1   63: 11, 4, 2  73: 11, 9, 2
4: 3, 1, 1  14: 5, 4, 1  24: 7, 3, 1  34: 8, 6, 1  44: 9, 8, 1   54: 10, 9, 1   64: 11, 5, 1  74: 11, 10, 1
5: 3, 2, 1  15: 5, 5, 1  25: 7, 4, 1  35: 8, 7, 1  45: 9, 9, 1   55: 10, 10, 1  65: 11, 5, 2  75: 11, 10, 2
6: 3, 3, 1  16: 6, 1, 1  26: 7, 5, 1  36: 8, 8, 1  46: 10, 1, 1  56: 11, 1, 1   66: 11, 6, 1  76: 11, 11, 1
7: 4, 1, 1  17: 6, 2, 1  27: 7, 6, 1  37: 9, 1, 1  47: 10, 2, 1  57: 11, 1, 2   67: 11, 6, 2  77: 11, 11, 2
8: 4, 2, 1  18: 6, 3, 1  28: 7, 7, 1  38: 9, 2, 1  48: 10, 3, 1  58: 11, 2, 1   68: 11, 7, 1
9: 4, 3, 1  19: 6, 4, 1  29: 8, 1, 1  39: 9, 3, 1  49: 10, 4, 1  59: 11, 2, 2   69: 11, 7, 2
 
gyfto:

У меня вопрос. Мозги уже закипают, чесное слово. Если можете - помогите.

Теперь вопрос: как по max (который у нас позиция элемента в массиве) восстановить значения slow, fast, period? Порядок заноса значений в temp[] приведён в Print(). В limit я поставил 3, но там может стоять любое число.


Там, где  "n++" делайте проверку на максимальность result, если максимально, надо запомнить значения slow, fast и т.д.
 
Можно еще три массива сделать (или один трехмерный) для slow, fast... Так лучше, потому-что вдруг захотите как-нибудь отсортировать результаты, всегда будут доступны параметры тестирования.
 
Если эти действия часто выполняются, например раз на бар или на 10 баров, то лучше в ините отмасштабировать массивы для результатов и три массива со значениями параметров, прокрутить эти циклы, заполнить массивы значениями периодов. Потом прокручивать все это в одном цикле. Тогда можно будет пользоваться функцией ArrayMaximum, сортировать всяко. Будет работать максимально быстро.
 
gyfto:

Нет, я тоже путался сначала. Например, у нас открыто два графика, еврена и золото. Так вот, они оба имеют индекс ноль. Но если у них появляются подокна, то они нумеруются с единицы. Например, я кинул три индюка на график евренны, два на золото, и все пять с #property separate_window и все разных подокнах. Тогда у еврены будут номера окон 0, 1, 2, 3, а у золота 0, 1, 2.

Точно! Я просто с индюками вообще не работаю можно сказать, так не обратил внимания когда изучал справку. Тут всё понятно.

gyfto:

Нееееа,я не про индикаторные буферы говорю, а про сэмулированные индикаторные буферы. А там ArrayResize(CustomBuffer, Bars) в обёртке из IndicatorCounted(), а концы крайних правых трендовых линий должны перерисовываться по биду.

А я спрашивал канкретно как отрисовать больше 6 линий на графике. В каком окне (0-ое или другое не важно). Вот это меня щяс больше всего интересует и об этом я спросил изначально.
 
Integer:

Там, где  "n++" делайте проверку на максимальность result, если максимально, надо запомнить значения slow, fast и т.д.

Не подумал.


Integer:
Можно еще три массива сделать (или один трехмерный) для slow, fast... Так лучше, потому-что вдруг захотите как-нибудь отсортировать результаты, всегда будут доступны параметры тестирования.

Трёхмерный - это идеальный вариант, но ArrayMaximum() работает только по одномерному, поэтому придётся сводить массив в линейный, и опять придётся разбираться где что. У меня же fastMax=slow, в том-то вся и беда. А вот три разных массива... У меня же результат-то один, поэтому или один трёхмерный, или один линейный.


Integer:
отмасштабировать массивы для результатов

Вот этой терминологии не знаю, поясните. Создать линейный массив длинной limit в кубе?


Ну уже хоть какой-то вариант есть. Через MathMax(result, resultPrev).