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

 
Vitalie Postolache:

Na also, das ist doch mal was anderes, jetzt ist klar, worauf sich die 1% beziehen ;)

if(Open[x] > Close[x]+Open[x]*0.01) {code}
Man versteht die Sprache nicht: Für zwei Wörter braucht man 10 Zeilen, für 10 Wörter reichen nur zwei... Man sollte meinen, es gäbe eine Reihenfolge beim Programmieren und am Ende ein Chaos).
 
spoiltboy:
Der Expert Advisor berücksichtigt die Minimal- und Maximalwerte der letzten X Bars und platziert die Orders nach diesen Werten. Wenn der Höchst- oder Mindestwert unterschritten wird, sollten Sie den entsprechenden Auftrag löschen und mit neuen Daten öffnen.


Ich habe nicht genau verstanden, wann Sie die Pausen ändern, aber ich habe es so gemacht, dass wenn der Mindestpreis höher ist als der bestehende BuyLimit-Einstellpreis, dann müssen Sie ihn auf den neuen Min-Preis ändern.

Für SellLimit - gespiegelt.

Ich habe nur den Code geschrieben, ihn aber nicht überprüft - ich überlasse es Ihnen, den Algorithmus und den Code im Allgemeinen zu ändern und auf seine Richtigkeit hin zu überprüfen.

//--- input variables
input    double   LotB=0.1;      // Лот Buy
input    double   LotS=0.1;      // Лот Sell
input    int      Pointsl=100;   // StopLoss в пунктах
input    int      Pointtp=100;   // TakeProfit в пунктах
input    int      NumBars=10;    // Количество баров для поиска Max/Min
input    int      Magic=100500;  // Magic

//--- global variables
struct DataPendingOrder
  {
   int      number;     // Количество
   double   price_set;  // Цена установки
  };

struct DataPending
  {
   DataPendingOrder  buy_limit;  // BuyLimit
   DataPendingOrder  buy_stop;   // BuyStop
   DataPendingOrder  sell_limit; // SellLimit
   DataPendingOrder  sell_stop;  // SellStop
  };

struct DataOrders
  {
   int         buy;     // Количество позиций Buy
   int         sell;    // Количество позиций Sell
   DataPending order;   // Данные отложенного ордера
  };
DataOrders getData;   // Данные ордеров и позиций
double lotB, lotS;
int    pointsl, pointtp, numBars;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
   numBars=(NumBars<1?1:NumBars>Bars?Bars:NumBars);
   pointsl=(Pointsl<0?0:Pointsl);
   pointtp=(Pointtp<0?0:Pointtp);
   double minLot=SymbolInfoDouble(Symbol(),SYMBOL_VOLUME_MIN);
   double maxLot=SymbolInfoDouble(Symbol(),SYMBOL_VOLUME_MAX);
   lotB=(LotB<minLot?minLot:LotB>maxLot?maxLot:LotB);
   lotS=(LotS<minLot?minLot:LotS>maxLot?maxLot:LotS);
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
   //--- заполним структуру количеством ордеров и позиций
   GetNumOrders(Symbol(),Magic,getData);
  
   //--- найдём максимальную и минимальную цены за bars свечей
   double maxPrice=0.0, minPrice=DBL_MAX;
   for(int i=0; i<numBars; i++) {
      double max_i=iHigh(Symbol(),PERIOD_CURRENT,i);
      if(max_i>maxPrice) maxPrice=max_i;
      double min_i=iLow(Symbol(),PERIOD_CURRENT,i);
      if(min_i<minPrice) minPrice=min_i;
      }

   //--- если нету рыночных Buy
   if(getData.buy==0) {
      //--- если нет отложенного BuyLimit
      if(getData.order.buy_limit.number==0) {
         double slB=(pointsl==0?0:NormalizeDouble(minPrice-pointsl*Point(),Digits()));
         double tpB=(pointtp==0?0:NormalizeDouble(minPrice+pointtp*Point(),Digits()));
         ResetLastError();
         int ticketUP=OrderSend(Symbol(), OP_BUYLIMIT, lotB, minPrice, 3, slB, tpB, "", Magic, 0, clrRed);
         if(ticketUP==-1) Print("ERROR SETTING OP_BUYLIMIT :",GetLastError());
         else Print("OP_BUYLIMIT OK");
         }
      //--- если есть BuyLimit
      else {
         //--- если цена Min больше цены установки BuyLimit
         if(minPrice>getData.order.buy_limit.price_set) {
            // модифицировать BuyLimit - поставить его на цену minPrice ...
            //--- ... и сместить его стоп-уровни относительно новой цены установки
            }
         }
      }
  
   //--- если нету рыночных Sell
   if(getData.sell==0) {
      //--- если нет отложенного SellLimit
      if(getData.order.sell_limit.number==0) {
         double slS=(pointsl==0?0:NormalizeDouble(maxPrice+pointsl*Point(),Digits()));
         double tpS=(pointtp==0?0:NormalizeDouble(maxPrice-pointtp*Point(),Digits()));
         ResetLastError();
         int ticketD=OrderSend(Symbol(), OP_SELLLIMIT, lotS, maxPrice, 3, slS, tpS, "", Magic, 0, clrBlue);
         if(ticketD==-1) Print("ERROR SETTING OP_SELLLIMIT :",GetLastError());
         else Print("OP_SELLLIMIT OK");
         }
      //--- если есть SellLimit
      else {
         //--- если цена Max меньше цены установки SellLimit
         if(maxPrice<getData.order.sell_limit.price_set) {
            // модифицировать SellLimit - поставить его на цену maxPrice ...
            //--- ... и сместить его стоп-уровни относительно новой цены установки
            }
         }
      }

   //---
   string a=(numBars==1)?"bar: ":IntegerToString(numBars,1)+" bar's: ";
   Comment("Last ", a, "max ", DoubleToStr(maxPrice, Digits()), ", min ", DoubleToStr(minPrice, Digits()),".");
  }
//+------------------------------------------------------------------+
//| Записывает в структуру количество позиций и отложенных ордеров   |
//+------------------------------------------------------------------+
void GetNumOrders(string symbol_name, int magic_number, DataOrders &data_of) {
   ZeroMemory(data_of);
   for(int i=OrdersTotal()-1; i>=0; i--) {
      if(OrderSelect(i,SELECT_BY_POS)) {
         if(OrderMagicNumber()!=magic_number) continue;
         if(OrderSymbol()!=symbol_name)       continue;
         //--- рыночные позиции
         if(OrderType()==OP_BUY)    data_of.buy++;
         if(OrderType()==OP_SELL)   data_of.sell++;
         //--- отложенные ордера
         if(OrderType()==OP_BUYLIMIT)  {  data_of.order.buy_limit.number++;   data_of.order.buy_limit.price_set=OrderOpenPrice();   }
         if(OrderType()==OP_BUYSTOP)   {  data_of.order.buy_stop.number++;    data_of.order.buy_stop.price_set=OrderOpenPrice();    }
         if(OrderType()==OP_SELLLIMIT) {  data_of.order.sell_limit.number++;  data_of.order.sell_limit.price_set=OrderOpenPrice();  }
         if(OrderType()==OP_SELLSTOP)  {  data_of.order.sell_stop.number++;   data_of.order.sell_stop.price_set=OrderOpenPrice();   }
         }
      }
}
//+------------------------------------------------------------------+

Ich hoffe, Sie werden es herausfinden

 
Artyom Trishkin:

Warum löschen, wenn Sie den Einstellungspreis und den Stop und Takeout relativ zum neuen Niveau ändern können?

Ich habe gerade mit dem Studium begonnen, und die Löschoption war, die Anwendung der Funktion zu studieren, und ich habe mich gefragt, warum das nicht funktioniert.

Ich danke Ihnen allen für Ihr Feedback.

 

Möchte jemand wissen, wie der externe Reset-Befehl aussehen sollte?

wie es aussehen sollte

1) Wählen Sie aus der Liste eine Reihe von Bedingungen aus, die erfüllt sein müssen, damit der Befehl ausgelöst wird, z. B. einen Auftrag eröffnen

2) Der Auftrag wird geöffnet und der Befehl funktioniert unter keinen anderen Bedingungen. Die Filterung nach Ticket und Bestellmenge ist keine Option, da das Prinzip selbst über die Liste verteilt sein sollte.

 
if (MA1>BruttoMA1 && MA2<BruttoMA2 && Bid>MA1+Distanse*Point() ) Welcher Fehler tritt hier auf, wenn BruttoMA1[0], MA1[0] BruttoMA2[1] MA2[1] einen beweglichen Schnittpunkt verwenden und nach dem beweglichen Schnittpunkt auf den Abstand filtern. Wie genau ist diese Bedingung?
 
Movlat Baghiyev:
if (MA1>BruttoMA1 && MA2<BruttoMA2 && Bid>MA1+Distanse*Point() ) Was ist hier der Fehler, wenn BruttoMA1[0], MA1[0] BruttoMA2[1] MA2[1] den beweglichen Schnittpunkt verwenden und nach dem beweglichen Schnittpunkt nach dem Abstand filtern. Wie genau ist diese Bedingung?

WasGrossMA1 undGrossMA2 Ihnen zurückgeben, da gibt es wahrscheinlich einen Unterschied, Sie erhalten am Ende etwas wie dieses

MA1= 1,0050

if (MA1 > 0,0052) // es handelt sich nicht um den Preis selbst, sondern um seine Differenz, so dass es sich nicht um einen falschen Vergleich handelt

 
Vitaly Muzichenko:

WasGrossMA1 undGrossMA2 Ihnen zurückgeben, da gibt es höchstwahrscheinlich einen Unterschied, Sie erhalten am Ende etwas wie dieses

MA1= 1,0050

if (MA1 > 0,0052) // das heißt, nicht der Preis selbst, sondern seine Differenz, also ein falscher Vergleich

Können Sie mir sagen, wie man das richtig macht?
 
Vitaly Muzichenko:

WasGrossMA1 undGrossMA2 Ihnen zurückgeben, da gibt es höchstwahrscheinlich einen Unterschied, Sie erhalten am Ende etwas wie dieses

MA1= 1,0050

if (MA1 > 0,0052) // das heißt, nicht der Preis selbst, sondern seine Differenz, also ein falscher Vergleich

FRMA1=iMA(Symbol(), 0, Faster_MA_Period, Faster_MA_Shift, Faster_MA_method, Faster_MA_Apply_to, 0);
    FRMA2=iMA(Symbol(), 0, Faster_MA_Period, Faster_MA_Shift, Faster_MA_method, Faster_MA_Apply_to, 1);

    FMA1=iMA(Symbol(), 0, Fast_MA_Period, Fast_MA_Shift, Fast_MA_method, Fast_MA_Apply_to, 0);
    FMA2=iMA(Symbol(), 0, Fast_MA_Period, Fast_MA_Shift, Fast_MA_method, Fast_MA_Apply_to, 1);

    GrossMA1=iMA(Symbol(), 0, Gross_MA_Period, Gross_MA_Shift, Gross_MA_method, Gross_MA_Apply_to, 0);
    GrossMA2=iMA(Symbol(), 0, Gross_MA_Period, Gross_MA_Shift, Gross_MA_method, Gross_MA_Apply_to, 1);
 
Vitaly Muzichenko:

WasGrossMA1 undGrossMA2 Ihnen zurückgeben, da gibt es höchstwahrscheinlich einen Unterschied, Sie erhalten am Ende etwas wie dieses

MA1= 1,0050

if (MA1 > 0,0052) // das heißt, nicht der Preis selbst, sondern seine Differenz, also ein falscher Vergleich

Die Frage bezieht sich eher auf diese BedingungBid>MA1+Distanse*Point()
 

Guten Tag. Können Sie mir sagen, wo der Fehler liegt?

extern int pointsl=100, pointtp=100, MagicB=1111, MagicS=2222, bars=10;  extern double lotB=0.1, lotS=0.1;
double slB, tpB, slS, tpS;  double x=0, z=0; int ticketUP, ticketD;

void OnTick()
  {
double maxpr1=-9999; double minpr1=9999;

for(int shift1=0; shift1<bars; shift1++)
{double i=iHigh(Symbol(), PERIOD_CURRENT, shift1);
if (i>maxpr1){maxpr1=i;}}

for(int shiftA1=0; shiftA1<bars; shiftA1++)
{double y=iLow(Symbol(), PERIOD_CURRENT, shiftA1);
if (y<minpr1) {minpr1=y;}}



slS=NormalizeDouble(maxpr1+pointsl*Point,5);
tpS=NormalizeDouble(maxpr1-pointtp*Point,5);
ticketD=OrderSend(Symbol(), OP_SELLLIMIT, lotS, maxpr1, 3, slS, tpS, "", MagicS, 0, Blue);
if (ticketD==-1) Print("ERROR OP_SELL"); else Print("OP_SELL OK");
  } 

Alles funktioniert, er gibt eine Bestellung zum Preis von maxpr1 auf.

Dann möchte ich dasselbe tun, aber zum Preis von minpr1:

extern int pointsl=100, pointtp=100, MagicB=1111, MagicS=2222, bars=10;  extern double lotB=0.1, lotS=0.1;
double slB, tpB, slS, tpS;  double x=0, z=0; int ticketUP, ticketD;

void OnTick()
  {
double maxpr1=-9999; double minpr1=9999;

for(int shift1=0; shift1<bars; shift1++)
{double i=iHigh(Symbol(), PERIOD_CURRENT, shift1);
if (i>maxpr1){maxpr1=i;}}

for(int shiftA1=0; shiftA1<bars; shiftA1++)
{double y=iLow(Symbol(), PERIOD_CURRENT, shiftA1);
if (y<minpr1) {minpr1=y;}}



slS=NormalizeDouble(minpr1+pointsl*Point,5);
tpS=NormalizeDouble(minpr1-pointtp*Point,5);
ticketD=OrderSend(Symbol(), OP_SELLLIMIT, lotS, minpr1, 3, slS, tpS, "", MagicS, 0, Blue);
if (ticketD==-1) Print("ERROR OP_SELL"); else Print("OP_SELL OK");
  }

Fehler 130 (falsche Haltestellen). Was mache ich falsch?

Grund der Beschwerde: