Jede Anfängerfrage, um das Forum nicht zu überladen. Fachleute, gehen Sie nicht vorbei. Nirgendwo ohne dich - 6. - Seite 505

 
Forexman77:
Sie brauchen es natürlich! Wie lässt sich diese Konstruktion nun auf die Suche nach dem Minimum anwenden? Ich kann es nicht mit meinem Gehirn machen)

Um das Maximum zu finden, wird der Variablen val der Wert 0 zugewiesen (offensichtlich kleiner als jeder der Indikatorwerte).

Das bedeutet, dass wir, um das Minimum zu finden, einen absichtlich höheren Wert hinzufügen müssen. Sie können die Konstante EMPTY_VALUE oder den Indikatorwert direkt auf einen Balken anwenden, unter dem das Minimum gesucht wird.

val=EMPTY_VALUE;

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

    ind=iMA(...,i);

   if(ind< val) val=ind;

}

Oder so:

val=MA(...,1);


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

    ind=iMA(...,i);

   if(ind< val) val=ind;

}
 
Forexman77:

Natürlich tut sie das! Wie wendet man nun diese Konstruktion an, um das Minimum zu finden? Ich kann es nicht herausfinden.)
Und ich möchte lernen, wie man ein Array deklariert. Ich habe es auf diese Weise versucht:

Das Ergebnis ist -1.



Die Schleife durchläuft 34 Werte und das Array enthält nur 33 Zellen, korrekt.

Und versuchen Sie ArrayMinimum(num_array,WHOLE_ARRAY,0);

 
Forexman77:

... Ich möchte auch lernen, wie man ein Array deklariert...

Wenn auch nur zum Training und zu kognitiven Zwecken...

Der Zeitraum, in dem das Minimum und das Maximum bestimmt werden, sollte ein externer Parameter sein, um eine Abstimmung und Optimierung zu ermöglichen.

extern int p=34; 

Zunächst einmal wird das Array ohne Größe deklariert:

double val[];

Die Array-Deklaration erfolgt in einem allgemeinen Abschnitt, nicht in einer Funktion.

In der Funktion init wird die Größe auf das Array gesetzt:

int init(){

   ArrayResize(val,p);

} 

In der Startfunktion füllen wir nun das Array:

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

Schließlich werden ArrayMaximum() und ArrayMinimum() auf das Array angewendet.

 
Integer:

Um das Maximum zu finden, wird der Variablen val der Wert 0 zugewiesen (offensichtlich kleiner als jeder der Werte des Indikators).

Das bedeutet, dass wir, um das Minimum zu finden, einen absichtlich höheren Wert hinzufügen müssen. Sie können die Konstante EMPTY_VALUE oder den Indikatorwert direkt auf einen Balken anwenden, unter dem das Minimum gesucht wird.

Oder so:

Ich danke Ihnen vielmals!
 
evillive:

Die Schleife durchläuft 34 Werte, während das Array nur 33 Zellen enthält, korrigieren Sie dies.

Und versuchen Sie ArrayMinimum(num_array,WHOLE_ARRAY,0);

Herzlichen Dank!
 

Liebe Programmiererkollegen! Ich bin in Schwierigkeiten, bitte helfen Sie mir.

Ich habe mir bereits den Kopf über diesen Code zerbrochen.

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

Hier ist die gesamte Funktion:

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

Erreicht Print und das ist die Ausgabe:


Während Ticket: 225299700 ein OP_SELLLIMIT-Bestellungsticket ist.

Und er ändert den Stop-Loss dieses ausgewählten Auftrags wie erwartet. Aber OP_BUY wird nicht gesehen, obwohl ich sicher bin, dass es existiert:

Was könnte das Problem sein? Warum tut es mir das an? Bitte helfen Sie mir zu verstehen!

 
#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;
  }
ALLE FUNKTIONEN außer den beiden Kauf- und Verkaufsbedingungen stammen aus Kims Zweigstelle...... Bitte sagen Sie mir, was ich falsch gemacht habe... Ich brauche eine Transaktion pro Schnittpunkt
 

eine weitere Frage zur Funktion

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

Wie kann man ein Rechteck vorwärts statt rückwärts zeichnen, z. B. fünf Balken vorwärts zu einem bestimmten Preis...... und es nicht neu zeichnen

 
artmedia70:

Ich habe es mir angesehen. Ich danke Ihnen.

Die Frage enthält allerdings nicht viele Informationen. Auf den Stundenbalken im Monat gibt es eine Menge Extreme. Und nebenbei bemerkt, Extremwerte von was genau?


Ich bin davon ausgegangen, dass es nur zwei monatliche Extremwerte gibt - Minimum und Maximum... Nun, wie auch immer, zuerst war es ein langer Code, deshalb habe ich um Hilfe gebeten... Aber dann dämmerte es mir, dass ich es in vier Zeilen unterbringen konnte.
 
Sagen Sie es mir bitte. In dem Build über 600. Kann der Makler echte Volumina angeben?