Любой вопрос новичка, чтоб не захламлять форум. Профи, не проходите мимо. Без вас никуда - 6. - страница 505

 
Forexman77:
Нужно, конечно! Ну, как применить данную конструкцию к поиску минимума? Пораскинув мозгами у меня не получается)

Для поиска максимума переменной val присваивается значение 0 (заведомо меньшее значение, чем любое из значений индиктаора).

Значит для поиска минимума надо присовоить заведомо большее значение. Можно использовать константу EMPTY_VALUE или непосредственно значение индикатора на каком-нибудь баре среди которых выполняется поиск минимума.

val=EMPTY_VALUE;

for(i=1;i<=15;i++) {

    ind=iMA(...,i);

   if(ind<val) val=ind;

}

Или так:

val=MA(...,1);


for(i=2;i<=15;i++) {

    ind=iMA(...,i);

   if(ind<val) val=ind;

}
 
Forexman77:

Нужно, конечно! Ну, как применить данную конструкцию к поиску минимума? Пораскинув мозгами у меня не получается)
Да и объявлять массив научиться хочу. Попробовал так:

Выходит -1.



Цикл перебирает 34 значения, а массив содержит только 33 ячейки, исправьте.

И попробуйте всё же ArrayMinimum(num_array,WHOLE_ARRAY,0);

 
Forexman77:

... Да и объявлять массив научиться хочу...

Если просто для тренировки и с познавательной целью...

Период на котором определяется минимум и максимуму - это должен быть внешний параметр для обеcпечения возможности настройки и оптимизации.

extern int p=34; 

Значит сначала массив объявляется без размера:

double val[];

Объявление массива делается в общей секции, а не в функции.

В функции init массиву устанавливается размер:

int init(){

   ArrayResize(val,p);

} 

Теперь в функции start заполняем массив:

for(int i=0;i<p;i++) val[i]=iMA(...,i+1);

Наконец к массиву применяем ArrayMaximum() и ArrayMinimum().

 
Integer:

Для поиска максимума переменной val присваивается значение 0 (заведомо меньшее значение, чем любое из значений индиктаора).

Значит для поиска минимума надо присовоить заведомо большее значение. Можно использовать константу EMPTY_VALUE или непосредственно значение индикатора на каком-нибудь баре среди которых выполняется поиск минимума.

Или так:

Спасибо огромное!
 
evillive:

Цикл перебирает 34 значения, а массив содержит только 33 ячейки, исправьте.

И попробуйте всё же ArrayMinimum(num_array,WHOLE_ARRAY,0);

Спасибо огромное!
 

Дорогие товарищи программисты! У меня беда, помогите пожалуйста.

Совсем уже голову сломал об этот код.

//В условии прописано что работаем с 
if(OrderType() == OP_BUY){}
//, но метатрейдер почему то игнорирует это условие, и работает только с OP_SELLLIMIT

Вот вся функция:

//+------------------------------------------------------------------+
//| Модифицируем стоплоссы                                           |
//+------------------------------------------------------------------+   
void modify_stoploss()
  {
   for(int i=0; i<=OrdersTotal(); i++)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
        {
         if(OrderSymbol()==Symbol())
           {
            if(OrderMagicNumber()==magic)
              {
               if(OrderType() == OP_BUY)
                 {
                  if(chek_way()==1)
                    {
                     double stoploss=NormalizeDouble(pre_openPrice(OP_BUY),Digits);
                     Print("Стоплосс для Бай ",OrderTicket()," = ", stoploss);
                     OrderModify(OrderTicket(),OrderOpenPrice(),stoploss,OrderTakeProfit(),0,CLR_NONE);
                    }
                 }
               if(OrderType() == OP_SELL)
                 {
                  if(chek_way()==0)
                    {
                     stoploss=NormalizeDouble(pre_openPrice(OP_SELL),Digits);
                     Print("Стоплосс для Cелл ",OrderTicket()," = ", stoploss);
                     OrderModify(OrderTicket(),OrderOpenPrice(),stoploss,OrderTakeProfit(),0,CLR_NONE);
                    }
                 }
              }
           }
        }
     }
  }

Доходит до Print и вот что он выдает:


В то время как тикет: 225299700 является тикетом ордера OP_SELLLIMIT.

И дальше все как положено модифицирует стоплосс этого выбранного ордера. А OP_BUY в упор не видит, хотя они конечно же есть:

В чем может быть проблема? За что он так со мной? Помогите разобраться пожалуйста!

 
#property strict
#include <Indicators\Trend.mqh>
bool ind;
CiMA MA;
extern int pos=1;
extern int sl=40;
extern int tp=70;
datetime time;
datetime time2;
bool trade=false;
bool trade2=false;
int a,b;
int OnInit()
  {
//---
   MA.Create(Symbol(),PERIOD_CURRENT,10,6,MODE_EMA,PRICE_CLOSE);//создал машку
//---
   return(INIT_SUCCEEDED);
   
  }
void OnTick()
  {
//---
  if(IsNewBar()==true)//если новый бар включаемся
     {
     if(buy(pos)==true)//если цена выше МА продолжаем
     {
      if(!ExistPositions(Symbol(),-1,-1,0))//если нету открых ордеров продолжаем
        {

         if(GetTypeLastClosePos(Symbol(),-1)!=OP_BUY)//если тип последней закрытой позиции был не на покупку то тогда только покупаем таким образом я пред остерегаюсь от повторных входов в покупку если цена 
//все ещо выше МА...но почему то не работает открываются и дальше сделки на покупку если ордер закрылся выше МА....ХОТЯ НЕ ДОЛЖО ТАК КАК Я ОГРАНИЧИЛ ПО ТИПУ ПОЗИЦИИ ПОСЛЕДНЮЮ СДЕЛКУ И ОНИ ДОЛЖНЫ ТОЛЬКО 
//       ЧЕРЕДОВАТСЯ И УЖ НИ КАК НЕ ПОВТОРЯТСЯ ПО НЕСКОЛЬКО РАЗ ПОДРЯД
           {
            trade=true;
           }
  if(trade==true)
        {
         OpenPosition(Symbol(),OP_BUY,0.1,Ask-sl*Point,Ask+tp*Point);
         trade=false;
        }
}
        }
    
     
if(sell(pos)==true)
{
   if(!ExistPositions(Symbol(),-1,-1,0))
     {

      if(GetTypeLastClosePos(Symbol(),-1)!=OP_SELL)
        {
         trade2=true;
        }

      if(trade2==true)
        {
         OpenPosition(Symbol(),OP_SELL,0.1,Bid+sl*Point,Bid-tp*Point);
         trade=false;
      }
  }}
 }
  }

//возвращает истину если закрытие бара  с указаной позицией выше МА

bool buy(int pos)
  {
   if(iClose(Symbol(),0,pos)>MA.Main(1))
      return true;
   else
      return false;
  }
//+------------------------------------------------------------------+
//| возвращает истину если закрытие бара  с указаной позицией ниже МА
//+------------------------------------------------------------------+
bool sell(int pos)
  {
   if(iClose(Symbol(),0,pos)<MA.Main(1))
      return true;
   else return false;
  }
ВСЕ ФУНКЦИИ кроме двох условий на покупку и продажу взяты из ветки кима......подскажите пожалуйста где ошибся...нужно чтобы одна сделка по одному пересечению
 

ещо вопрос по поводу функции

/SetRectangle(clrBlue,"Прямоугольник",Time[10],Low[10],Time[0],High[0]);
//Если bk=true, то будет залит цветом, если false - то просто "рамка" ... sz при "просто рамка" - это ширина линий "рамки"
//

//+----------------------------------------------------------------------------+
void SetRectangle(color cl, string nm="", datetime t1=0, double p1=0, datetime t2=0, double p2=0, int sz=0, bool bk=true) {
   if (ObjectFind(nm)<0) ObjectCreate(nm, OBJ_RECTANGLE, 0, 0, 0, 0, 0);
   ObjectSet(nm, OBJPROP_TIME1   ,t1);
   ObjectSet(nm, OBJPROP_PRICE1  ,p1);
   ObjectSet(nm, OBJPROP_TIME2   ,t2);
   ObjectSet(nm, OBJPROP_PRICE2  ,p2);
   ObjectSet(nm, OBJPROP_COLOR   ,cl);
   ObjectSet(nm, OBJPROP_WIDTH   ,sz);
   ObjectSet(nm, OBJPROP_BACK    ,bk);
}

как сделать чтобы прямоугольник рисовался наперед а не назад к примеру на пять баров вперед по указаной цене ......и не перерисовывался

 
artmedia70:

Глянул. Спасибо.

А вот в вопросе мало инфы. В месяце много экстремумов на часовых барах. И, кстати, экстремума чего именно?


Я так предполагал, что экстремумов месячных всего два - min и max... ну да бог с ними, сначала длинный код получался, поэтому помощи просил... но озарило, вместился в четыре строки.
 
Скажите пожалуйста. В билде, что выше 600. Брокер может выдавать реальные объемы?