Qualsiasi domanda da principiante, per non ingombrare il forum. Professionisti, non passate oltre. Da nessuna parte senza di te - 6. - pagina 505

 
Forexman77:
Ne hai bisogno, ovviamente! Bene, come applicare questa costruzione per cercare il minimo? Non posso farlo con il mio cervello)

Per trovare il massimo, alla variabile val viene assegnato il valore 0 (ovviamente inferiore a qualsiasi valore dell'indicatore).

Questo significa che per trovare il minimo, dobbiamo aggiungere un valore volutamente più alto. Si può usare la costante EMPTY_VALUE o il valore dell'indicatore direttamente su qualche barra tra cui si cerca il minimo.

val=EMPTY_VALUE;

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

    ind=iMA(...,i);

   if(ind< val) val=ind;

}

O come questo:

val=MA(...,1);


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

    ind=iMA(...,i);

   if(ind< val) val=ind;

}
 
Forexman77:

Ne hai bisogno, naturalmente! Bene, come si applica questa costruzione per trovare il minimo? Non riesco a capirlo).
E voglio imparare come dichiarare un array. Ho provato in questo modo:

Esce -1.



Il ciclo passa attraverso 34 valori e l'array contiene solo 33 celle, corretto.

E provate ArrayMinimum(num_array,WHOLE_ARRAY,0);

 
Forexman77:

... Voglio anche imparare come dichiarare un array...

Se solo per allenamento e scopo cognitivo...

Il periodo in cui vengono determinati il minimo e il massimo - dovrebbe essere un parametro esterno per consentire la messa a punto e l'ottimizzazione.

extern int p=34; 

Quindi, prima di tutto, l'array è dichiarato senza dimensione:

double val[];

La dichiarazione dell'array è fatta in una sezione comune, non in una funzione.

Nella funzione init, la dimensione è impostata sull'array:

int init(){

   ArrayResize(val,p);

} 

Ora nella funzione di avvio riempiamo l'array:

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

Infine , ArrayMaximum() e ArrayMinimum() sono applicate all'array.

 
Integer:

Per trovare il massimo, alla variabile val viene assegnato il valore 0 (ovviamente inferiore a qualsiasi valore dell'indicatore).

Questo significa che per trovare il minimo, dobbiamo aggiungere un valore volutamente più alto. Si può usare la costante EMPTY_VALUE o il valore dell'indicatore direttamente su qualche barra tra cui si cerca il minimo.

O come questo:

Grazie mille!
 
evillive:

Il ciclo passa attraverso 34 valori, mentre l'array contiene solo 33 celle, correggetelo.

E provate ArrayMinimum(num_array,WHOLE_ARRAY,0);

Grazie mille!
 

Cari colleghi programmatori! Sono nei guai, per favore aiutatemi.

Mi sono già scervellato su questo codice.

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

Ecco l'intera funzione:

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

Raggiunge Print e questo è ciò che produce:


Mentre il ticket: 225299700 è un ticket d'ordine OP_SELLLIMIT.

E modifica lo stop loss di questo ordine selezionato come previsto. Ma OP_BUY non si vede, anche se sono sicuro che esiste:

Quale potrebbe essere il problema? Perché mi fa questo? Per favore, aiutatemi a capire!

 
#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;
  }
TUTTE le FUNZIONI tranne le due condizioni di acquisto e vendita sono prese dal ramo di kim...... per favore ditemi dove ho sbagliato...ho bisogno di una transazione per intersezione
 

un'altra domanda sulla funzione

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

come far disegnare un rettangolo in avanti invece che indietro, per esempio cinque barre in avanti ad un prezzo specificato...... e non ridisegnarlo

 
artmedia70:

Mi sono informato. Grazie.

Non ci sono molte informazioni nella domanda però. Ci sono molti estremi sulle barre delle ore nel mese. E a proposito, estremi di cosa esattamente?


Ho pensato che ci sono solo due estremi mensili - min e max... Beh, comunque, all'inizio era un codice lungo, è per questo che ho chiesto aiuto... Ma poi mi è venuto in mente che sono riuscito ad inserirlo in quattro righe.
 
Dimmelo per favore. Nella build sopra 600. Il broker può dare volumi reali?
Motivazione: