Qualquer pergunta de novato, de modo a não desorganizar o fórum. Profissionais, não passem por aqui. Em nenhum lugar sem você - 6. - página 505

 
Forexman77:
Você precisa disso, é claro! Bem, como aplicar esta construção para buscar o mínimo? Não posso fazer isso com meu cérebro)

Para encontrar o máximo, é atribuído ao valor da variável um valor 0 (obviamente menor que qualquer um dos valores do indicador).

Isto significa que para encontrar o mínimo, devemos acrescentar um valor deliberadamente maior. Você pode usar a constante EMPTY_VALUE ou o valor do indicador diretamente em alguma barra entre as quais o mínimo é pesquisado.

val=EMPTY_VALUE;

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

    ind=iMA(...,i);

   if(ind< val) val=ind;

}

Ou assim:

val=MA(...,1);


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

    ind=iMA(...,i);

   if(ind< val) val=ind;

}
 
Forexman77:

É claro que sim! Bem, como aplicar esta construção para encontrar o mínimo? Não consigo descobrir por meio de brainstorming).
E eu quero aprender como declarar uma matriz. Eu tentei desta maneira:

Sai -1.



O laço passa por 34 valores e a matriz contém apenas 33 células, correto.

E tente ArrayMinimum(num_array,WHOLE_ARRAY,0);

 
Forexman77:

... Também quero aprender a declarar uma matriz...

Se apenas para treinamento e propósito cognitivo...

O período no qual o mínimo e o máximo são determinados - deve ser um parâmetro externo para permitir o ajuste e a otimização.

extern int p=34; 

Portanto, antes de tudo, a matriz é declarada sem tamanho:

double val[];

A declaração da matriz é feita em uma seção comum, não em uma função.

Na função init, o tamanho é definido para a matriz:

int init(){

   ArrayResize(val,p);

} 

Agora, na função de partida, nós preenchemos a matriz:

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

Finalmente , ArrayMaximum() e ArrayMinimum() são aplicados à matriz.

 
Integer:

Para encontrar o máximo, é atribuído à variável val um valor 0 (obviamente menor do que qualquer um dos valores do acusador).

Isto significa que para encontrar o mínimo, devemos acrescentar um valor deliberadamente maior. Você pode usar a constante EMPTY_VALUE ou o valor do indicador diretamente em alguma barra entre as quais o mínimo é pesquisado.

Ou assim:

Muito obrigado!
 
evillive:

O laço passa por 34 valores, enquanto a matriz contém apenas 33 células, conserte-o.

E tente ArrayMinimum(num_array,WHOLE_ARRAY,0);

Muito obrigado!
 

Caros colegas programadores! Estou em apuros, por favor, me ajude.

Eu já me arrebentei com este código.

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

Aqui está a função completa:

//+------------------------------------------------------------------+
//| Модифицируем стоплоссы                                           |
//+------------------------------------------------------------------+   
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);
                    }
                 }
              }
           }
        }
     }
  }

Alcança a impressão e é isto que ela produz:


Enquanto bilhete: 225299700 é um bilhete de pedido OP_SELLLIMIT.

E modifica a parada de perda desta ordem selecionada, como esperado. Mas OP_BUY não é visto, embora eu tenha certeza de que existe:

Qual poderia ser o problema? Por que ele está fazendo isso comigo? Por favor, ajude-me a entender!

 
#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;
  }
TODAS AS FUNÇÕES exceto as duas condições de compra e venda são tiradas da filial da kim...... por favor me diga onde errei...eu preciso de uma transação por interseção
 

outra pergunta sobre a função

/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);
}

como fazer um retângulo traçar para frente em vez de para trás, por exemplo, cinco barras para frente a um preço especificado...... e não para redesenhá-lo

 
artmedia70:

Eu já dei uma olhada. Obrigado.

Mas não há muitas informações na pergunta. Há muitos extremos nas barras de horário no mês. E a propósito, extrema de quê exatamente?


Presumi que existem apenas dois extremos mensais - min e max... Bem, seja o que for, a princípio era um código longo, por isso pedi ajuda... Mas depois me apercebi, consegui encaixá-lo em quatro linhas.
 
Diga-me, por favor. Na construção acima de 600. O corretor pode dar volumes reais?
Razão: