Fragen von Neueinsteigern zu MQL4 und MQL5, Hilfe und Diskussion über Algorithmen und Codes - Seite 1614

 
Fast235 #:

nur diese Zeile wirft die Frage auf

-50 extra und ein Array

Es soll über/unter "0" gezeichnet werden.

Aber es geht auch ohne, ich brauche das Wesentliche, wie man Griffe benutzt.

 
Vladimir Simakov #:

Ich kann es nur empfehlen:

Andernfalls erhalten Sie ein "oops".))

Außerdem muss man nach der Teilung sofort auf ein Ganzes kommen. Andernfalls kann die binäre Zählung eine Menge Dinge bewirken).

 
MakarFX #:

Damit wird oberhalb/unterhalb von "0" gezeichnet.

aber es geht auch ohne, ich muss wissen, wie man Griffe benutzt.

ein Handle ist ein Zeiger auf die Indikator-Datei, er wird normalerweise in OnInit() erstellt

   Handle=iCustom(Symbol(),PERIOD_H1,"_iTrend",10);
//--- Если не удалось получить хендл индикатора
   if(Handle==INVALID_HANDLE)
     {
      PrintFormat("Failed to create handle of the iAO indicator for the symbol %s/%s, error code %d",
                  Symbol(),
                  EnumToString(Period()),
                  GetLastError());
      //---
      return(INIT_FAILED);
     }

weiter im Code

    if(CopyBuffer(Handle,0,1,1,Buffer1) <=0 проверка на ошибку
---
в Buffer1[1111] получаем значение
 
Fast235 #:

Handle ist ein Zeiger auf die Indikatordatei, er wird normalerweise in OnInit() erstellt

weiter im Code

Danke, aber es sieht aus wie die Hilfe und leider ist es nicht klar zu mir(

Deshalb habe ich gebeten, meinen Code in mql5 zu übersetzen, um die Logik der Arbeit zu verstehen

Ich mache es so

//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
   IndicatorSetInteger(INDICATOR_DIGITS,_Digits);
   prd = _Period > TimeFrame ? _Period : TimeFrame;
   atrHandle = iATR(_Symbol, prd, Per_Count);
   if(atrHandle == INVALID_HANDLE)
     {
      Print("Can't load indicator."); return INIT_FAILED;
     }
//--- indicator buffers mapping
   SetIndexBuffer(0,Label1Buffer,INDICATOR_DATA);
   SetIndexBuffer(1,Label2Buffer,INDICATOR_DATA);
   
   ArraySetAsSeries(Label1Buffer, true);
   ArraySetAsSeries(Label2Buffer, true);
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
  {
//---
   int limit,i;
   int barPlus=iBarShift(_Symbol,_Period,iTime(_Symbol,PERIOD_W1,WeekCount),false);
   limit=rates_total-prev_calculated-3;
   if(WeekCount!=0)limit=barPlus-1;
   if(limit<1) return(0);
   for(i=limit;i>=0;i--)
     {
      TimeToStruct(time[i],inTime);
      index01=iBarShift(_Symbol,PERIOD_D1,time[i],false);
      if(inTime.hour==0&&inTime.min==0)
        {
         Label1Buffer[i]=GetIndicator(atrHandle, index01+1);
        }
     }
   
//--- return value of prev_calculated for next call
   return(rates_total);
  }
//+------------------------------------------------------------------+
double GetIndicator(const int handle, const int i)
  {
   double res[1];
   if(CopyBuffer(handle, 0, i, 1, res) <= 0) return 0;
   return res[0];
  }
//+------------------------------------------------------------------+

Aber ich habe das Gefühl, etwas ist falsch und iMAOnArray ist nicht in der Hilfe erwähnt.

 

Guten Tag.

Ich kann das Problem mit dem Martin-Looping nicht lösen,

Ich kann das Problem mit der Schleifenbildung des Martins nicht lösen. Er wird nach der Ausführung unterbrochen:(n>=OrdersClose)- und dann wird der Martin nicht ausgelöst, bis ein profitabler Handel stattfindet,

Ich mussreturn(dLots) nach (n>=OrdersClose) haben und Martin wird wieder beginnen, wenn der nächste Handel wieder verliert.

Könnten Sie mir bitte sagen, wie man das macht?

double LOT()
{
   int n=0;
   double OL=dLots;
   for (int j = OrdersHistoryTotal()-1; j >= 0; j--)
   {
      if (OrderSelect(j, SELECT_BY_POS,MODE_HISTORY))
      {
         if (OrderSymbol() == Symbol() && OrderMagicNumber() == iMagic)
         {
            if (OrderProfit()<0) 
            {
               if (n==0) OL=NormalizeDouble(OrderLots()*K_Martin,DigitsLot);
               n++;
               if (n>=OrdersClose) {return(dLots);}
            }
            else
            {
               if (n==0) {return(dLots);}
               else {return(OL);}
            }
         }
      }
   }
   return(OL);
}
 

Guten Tag an alle!!!

Bitte geben Sie mir den im Grid Advisor Code vorgeschriebenen Hinweis auf die Anzeige des Durchschnittspreises im Chart. Das wäre in Ordnung, aber die Zeile wird nach dem Schließen des Rasters nicht korrekt gelöscht, d.h. der Durchschnittspreis wird nicht angezeigt. Bitte sagen Sie mir, was ich falsch gemacht habe. Hier ist der Code und das Bild.

//+----------------------------------------------------------------------------+
//| Ändern von Gruppenaufträgen |
//+----------------------------------------------------------------------------+
void ModifyOrders(int otype)
{
double avg_price, AveragePriceBuy, AveragePriceSell, order_lots = 0;
price = 0;

for(int i = OrdersTotal()-1; i>=0; i--)
{
if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
{
if(OrderSymbol() == Symbol() && OrderMagicNumber() == Magic && OrderType() == otype)
{
Preis += OrderOpenPrice() * OrderLots();
order_lots += OrderLots() ;
}
}
}
avg_price = NormalizeDouble(price / order_lots, Digits);
AveragePriceBuy = NormalizeDouble(avg_price + Spread, Digits);
AveragePriceSell = NormalizeDouble(avg_price - Spread, Digits);
{
ObjectDelete(0, "AveragePriceLine");
ObjectCreate("AveragePriceLine" ,OBJ_HLINE, 0, 0 ,AveragePriceBuy);
ObjectCreate("AveragePriceLine" ,OBJ_HLINE, 0, 0 ,AveragePriceSell);
ObjectSet("AveragePriceLine",OBJPROP_COLOR,Blue);
}
if ((otype == OP_BUY) && (Drawdown <= DrawdownClosingTakeprofitZero))
tp = NormalizeDouble (AveragePriceBuy + TakeProfitGroupOrder*Point, Digits);
if ((otype == OP_SELL) && (Drawdown <= DrawdownClosingTakeprofitZero))
tp = NormalizeDouble (AveragePriceSell - TakeProfitGroupOrder*Point, Digits);
if ((otype == OP_BUY) && (Drawdown > DrawdownClosingTakeprofitZero))
tp = NormalizeDouble (AveragePriceBuy, Digits);
if ((otype == OP_SELL) &/or& (Drawdown > DrawdownClosingTakeprofitZero))
tp = NormalizeDouble (AveragePriceSell, Digits);

for(int i = OrdersTotal()-1; i>=0; i--)
{
if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
{
if(OrderSymbol() == Symbol() && OrderMagicNumber() == Magic && OrderType() == otype)
{
if(OrderModify(OrderTicket(), OrderOpenPrice(), 0, tp, 0))
Print("Orders successfully modified!");
else Print("Fehler beim Ändern von Aufträgen!");
}
}
}
}


 
EVGENII SHELIPOV #:

Guten Tag an alle!!!

Bitte sagen Sie mir, dass im Grid Advisor Code die Anzeige des Durchschnittspreises auf dem Chart vorgeschrieben ist. Es wäre alles in Ordnung, aber die Zeile wird nach dem Schließen des Rasters nicht korrekt gelöscht, d. h. der Durchschnittspreis wird nicht angezeigt. Bitte sagen Sie mir, was ich falsch gemacht habe. Hier ist der Code und das Bild.

Probieren Sie es so

//+----------------------------------------------------------------------------+
//| Модификация групповых ордеров                                              |
//+----------------------------------------------------------------------------+
void ModifyOrders(int otype)
{
    double avg_price, AveragePriceBuy, AveragePriceSell, order_lots = 0;
    price = 0;
   
    for(int i = OrdersTotal()-1; i>=0; i--)
    {
       if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
       {
         if(OrderSymbol() == Symbol() && OrderMagicNumber() == Magic && OrderType() == otype)
         {
            price += OrderOpenPrice() * OrderLots();
            order_lots += OrderLots() ;
         }
       }
    }
    avg_price = NormalizeDouble(price / order_lots, Digits);
    AveragePriceBuy = NormalizeDouble(avg_price + Spread, Digits);
    AveragePriceSell = NormalizeDouble(avg_price - Spread, Digits);
    if(ObjectFind(0,"AveragePriceLineBuy")==0)
     {
     ObjectDelete(0,"AveragePriceLineBuy");
     ObjectCreate(0,"AveragePriceLineBuy" ,OBJ_HLINE, 0, 0 ,AveragePriceBuy);
     ObjectSetInteger(0,"AveragePriceLine",OBJPROP_COLOR,Blue);
     }
    else
     {
     ObjectCreate(0,"AveragePriceLineBuy" ,OBJ_HLINE, 0, 0 ,AveragePriceBuy);
     ObjectSetInteger(0,"AveragePriceLine",OBJPROP_COLOR,Blue);
     }
    if(ObjectFind(0,"AveragePriceLineSell")==0)
     {
     ObjectDelete(0,"AveragePriceLineSell");
     ObjectCreate(0,"AveragePriceLineSell" ,OBJ_HLINE, 0, 0 ,AveragePriceSell);
     ObjectSetInteger(0,"AveragePriceLine",OBJPROP_COLOR,Blue);
     }
    else
     {
     ObjectCreate(0,"AveragePriceLineSell" ,OBJ_HLINE, 0, 0 ,AveragePriceSell);
     ObjectSetInteger(0,"AveragePriceLine",OBJPROP_COLOR,Blue);
     }
    if ((otype == OP_BUY) && (Drawdown <= DrawdownClosingTakeprofitZero)) 
    tp = NormalizeDouble (AveragePriceBuy + TakeProfitGroupOrder*Point, Digits);
    if ((otype == OP_SELL) && (Drawdown <= DrawdownClosingTakeprofitZero))
    tp = NormalizeDouble (AveragePriceSell - TakeProfitGroupOrder*Point, Digits);
    if ((otype == OP_BUY) && (Drawdown > DrawdownClosingTakeprofitZero)) 
    tp = NormalizeDouble (AveragePriceBuy, Digits);
    if ((otype == OP_SELL) && (Drawdown > DrawdownClosingTakeprofitZero))
    tp = NormalizeDouble (AveragePriceSell, Digits);
    
    for(int i = OrdersTotal()-1; i>=0; i--) 
    {
       if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
       {
           if(OrderSymbol() == Symbol() && OrderMagicNumber() == Magic && OrderType() == otype)
           {
               if(OrderModify(OrderTicket(), OrderOpenPrice(), 0, tp, 0))
                  Print("Ордера успешно модифицированы!");
                else Print("Ошибка модификации ордеров!");
           }
       }
    }
}   

Oder besser verschreiben,

wenn es keine offenen Verkaufsaufträge gibt, löschen Sie die Zeile Verkaufen

das gleiche für die Bai

 
Guten Abend, wie setzt man den Status einer grafischen Schaltfläche zurück, wenn man sie anklickt, so dass sie nicht die ganze Zeit gedrückt ist, bis man sie erneut anklickt?
 
Nerd Trader #:
Guten Abend, wie setzt man den Status einer grafischen Schaltfläche zurück, wenn man sie anklickt, so dass sie nicht die ganze Zeit gedrückt ist, bis man sie erneut anklickt?
ObjectSetInteger(0,name,OBJPROP_STATE,false);
 
MakarFX #:
Nein, Sie haben das falsch verstanden. Ich möchte, dass der Status wie bei normalen Schaltflächen zurückgesetzt wird, nachdem der Klick losgelassen wurde. Wie implementiert man das, wenn mql4 keine Maustasten-Zustandsereignisse hat: Klicken/Freigeben.