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

 

Вот в чем моя задумка:

я открываю ордер, а дальше зависит от того в каком балансе он закрылся.

если баланс меньше нуля, то убыток фиксируем и запоминаем, если больше нуля то начинаем работать с начала.

если наш убыток меньше нуля, то мы зафиксировали его и присвоили переменной, например: Minus

Minus = OrderProfit (- 45 центов);

AccountAqviti + Minus + мое значение (моя совесть)

дальше по следующему ордеру:

если прибыль этого ордера больше AccountAqviti + Minus + мое значение (моя совесть), тоордер закрываем, если нет, го больше нуля, то фиксируем:

(AccountAqviti + OrderProfit) - (AccountAqviti + Minus + мое значение (моя совесть)) = Minus

если Minus >= 0, то Minus = 0;

 
belck:

Вот в чем моя задумка:


С задумками нужно обращаться в сервис Работа, а здесь принято конкретные ситуации разруливать с конкретным кодом.
 

Доброго дня! Хочу создать индикатор, который отображает канал на индикаторах типа МАСD, АО и подобных. Данный индикатор накладывается на окно базовых индикаторов (МАСD, АО и подобных) и рисуется в виде параллельных линий выше и ниже 0. Данные линии определяются как среднее значение пиков-максимумов (выше 0) и впадин-минимумов (ниже 0) за указанный период.
На примере индикатора АО пытаюсь реализовать задуманное, но что-то не выходит.
Алгоритм:
записываем показания индикатора в массив,
пробегаемся по этому массиву в поисках пиков/впадин,
записываем их в определённые массивы,
находим среднее значение пиков, затем впадин,
присваиваем индикаторному буферу полученное значение.
На данном этапе в коде определяется не совсем канал (прилипание к 0) на индикаторе, а среднее по максимумам пиков и среднее по минимумам впадин.
Определение пиков и впадин можно убрать из кода и оформить в виде ф-ции, но пока оставила так-это сути не меняет.
Проблемы:
1. подвисание терминала (значительное)
2. линии не отображается как среднее, получаются, как макс/мин за период.
Долго разбиралась, но не могу понять причину проблем. Помогите, пожалуйста, исправить мой код или укажите ссылочку, где рассматриваются подобные вопросы или приводится базовый код, буду разбираться дальше. Заранее спасибо.

int start(){
    int limit=Bars-IndicatorCounted();
    for(int i=limit;i>=0;i--){
//     if (IsNewBar()){
       int j=0;
       for (int d=2;d<=period-1;d++){         
             ArrayResize(AO,j+1); 
             AO[j]=AO(d);                            // Запишем данные инд. в цикле в массив
             Print("АО-",AO[j],"-",d,"-",i);
             j++;
       }             
       int k_up=0,k_dw=0; double SDw=0,SUp=0,P1=0,P2=0;      
       //собираем экстремумы выше 0
       for (int p=4;p<=period-1; p++){          
         if (AO[p]>AO[p+1] && AO[p]>AO[p-1] 
            && AO[p+1]>AO[p+2]
            && AO[p+2]>AO[p+3]
            && AO[p+3]>0
            && AO[p-1]>AO[p-2]
            && AO[p-2]>AO[p-3]
            && AO[p-3]>0){                           // Нашли макс
            ArrayResize(Up, k_up+1);                 // Размер массива донышек под кол-во найденных донышек
            Up[k_up]=AO(p);                          // Заносим значение пика в массив                 
            Print("значение пика-",Up[k_up],"-",p);           
            SUp=SUp+Up[k_up];
            P1=SUp/(k_up+1);            
            k_up++;                                  // Увеличиваем индекс массива донышек                                 
         }
         //собираем впадины ниже 0
         if (AO[p]<AO[p+1] && AO[p]<AO[p-1] 
            && AO[p+1]<AO[p+2]
            && AO[p+2]<AO[p+3]
            && AO[p+3]<0
            && AO[p-1]<AO[p-2]
            && AO[p-2]<AO[p-3]
            && AO[p-3]<0){                           // Нашли мин
            ArrayResize(Dw, k_dw+1);                 // Размер массива донышек под кол-во найденных донышек
            Dw[k_dw]=AO[p];                          // Заносим значение пика в массив                                            
            Print("значение донышка-",Dw[k_dw],"-",p);                                           
            SDw=SDw+Dw[k_dw];
            P2=SDw/(k_dw+1);           
            k_dw++;// Увеличиваем индекс массива донышек   
         }         
       }
       level1[i]=P1;
       level2[i]=P2;
    }
    return(0);
}
//+------------------------------------------------------------------+
double AO(int a){double AO=iAO( NULL, 0, a);
     return(AO);
}
 
спасибо! очень помогли!
 
LOA:

Доброго дня!
Проблемы:

1. подвисание терминала (значительное)

for (int d=2;d<=period-1;d++){         
             ArrayResize(AO,j+1); 


В цикле увеличивать размер массива это жестоко, потому и висим. Один раз увеличивайте сразу под размер. Или пользуйтесь таймсериями сразу


P.S. посмотрите личные сообщения

 

как сделать цикл по переменной типа string?

Пример

   double A[3];
   A[0]=iClose("EURUSD",0,0);
   A[1]=iClose("GBPUSD",0,0);
   A[2]=iClose("AUDUSD",0,0);
Как эту конструкцию заменить на цикл?
 
Добрый день, подскажите пожалуйста, как написать условие, при котором если прибыль открытого ордера составила один пунгкт, то закрыть этот ордер?
 
first_may:
Добрый день, подскажите пожалуйста, как написать условие, при котором если прибыль открытого ордера составила один пунгкт, то закрыть этот ордер?

Используя функцию.

https://www.mql5.com/ru/forum/131859/page3#434225

//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 19.02.2008                                                     |
//|  Описание : Возвращает суммарный профит открытых позиций в пунктах         |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    sy - наименование инструмента   (""   - любой символ,                   |
//|                                     NULL - текущий символ)                 |
//|    op - операция                   (-1   - любая позиция)                  |
//|    mn - MagicNumber                (-1   - любой магик)                    |
//+----------------------------------------------------------------------------+
int GetProfitOpenPosInPoint(string sy="", int op=-1, int mn=-1) {
  double p;
  int    i, k=OrdersTotal(), pr=0;

  if (sy=="0") sy=Symbol();
  for (i=0; i<k; i++) {
    if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
      if ((OrderSymbol()==sy || sy=="") && (op<0 || OrderType()==op)) {
        if (mn<0 || OrderMagicNumber()==mn) {
          p=MarketInfo(OrderSymbol(), MODE_POINT);
          if (p==0) if (StringFind(OrderSymbol(), "JPY")<0) p=0.0001; else p=0.01;
          if (OrderType()==OP_BUY) {
            pr+=(MarketInfo(OrderSymbol(), MODE_BID)-OrderOpenPrice())/p;
          }
          if (OrderType()==OP_SELL) {
            pr+=(OrderOpenPrice()-MarketInfo(OrderSymbol(), MODE_ASK))/p;
          }
        }
      }
    }
  }
  return(pr);
}
 
Rorschach:

как сделать цикл по переменной типа string?

Пример

Как эту конструкцию заменить на цикл?

   string asSymbols[3] = {"EURUSD", "GBPUSD", "AUDUSD"};
   double A[3] = {0};
   for (int i = 0; i < ArraySize(sSymbols) && i < ArraySize(A); i++) A[i]= iClose(asSymbols[i], 0, 0);
 
Zhunko:



Спасибо