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

 
Ihor Herasko:

Diese Methode der Swapberechnung wird als Rollover bezeichnet. In MT4 können Sie das nicht programmatisch wissen. Nur indirekt nach der mitternächtlichen Änderung der Arbeitsaufträge. Es gibt viele solcher kleinen, aber ziemlich unangenehmen Probleme in MT4. Im MT5 sind es etwas weniger, aber es gibt sie noch.

Dies sind die Swap-Werte in Pips. Sie sollten in die Währung der Einlage umgerechnet werden, basierend auf dem Volumen des Marktauftrags. Dann erhält man die tatsächliche Swap-Größe.

"Es gibt keine Möglichkeit, dies in MT4 programmatisch herauszufinden". - Ich danke Ihnen für Ihre Zeit und Ihre Antworten.

 

Guten Tag, liebe Forumsnutzer, bitte helfen Sie mir, den Algorithmus zu verstehen. Ziel ist es, die Preisspanne im angegebenen Zeitraum zu bestimmen und die Kauf- und Verkaufsstopps auf Maximum und Minimum zu setzen. StopLosses werden auf entgegengesetzte Aufträge gesetzt, TakeProfit sollte gleich StopLoss*2 sein.

Nach jeder Schließung durch Stop Loss wird der Auftrag mit demselben Stop Loss und Take Profit wie der geschlossene Auftrag wiederhergestellt, und der gesamte Zyklus ist abgeschlossen, sobald einer der Aufträge durch Take Profit geschlossen wurde. Und das alles von Anfang an, wir definieren den Bereich und gehen.

Aber jetzt platziert er einfach keinen TP, oder besser gesagt, er platziert ihn zum Eröffnungskurs und der Stop Loss liegt nicht auf der Range Size, d.h. nicht auf einer gegenläufigen Order. Vielen Dank im Voraus für die Hilfe.

static int prevtime = 0;
int MagicNumber = 12345678;
input int stoploss = 40;
input int takeprofit = 50;
input int padding = 5;
int a=1;
input string startTime = "14:35";
input string endTime = "18:35";
int expertBars;
double max, min;
bool isEndTime = true;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---
   //sendOrders();
   
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---
   
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
#include <expert.mq4>
 
int start()
{  
    //Возвращает максимум и минимум за промежуток
    if(isTime()) getMaxMin();
    
    // всё, что задается ниже - будет работать по "ценам открытия"
    //нового бара, т.е. будет срабатывать в момент его появления
    //на том графике, на кот. стоит советник
    CheckEvents( MagicNumber );
    if ( eventBuyClosed_SL > 0 ) {
        Alert( _Symbol, OrderClosePrice(), ": Buy-позиция закрыта по СтопЛоссу!" );
        double minstoplevel=MarketInfo(Symbol(),MODE_STOPLEVEL);
        Alert("Минимальный стоп левел: ", minstoplevel);
        OrderSend(_Symbol,OP_BUYSTOP,OrderLots(),OrderOpenPrice(),3,OrderStopLoss(),OrderTakeProfit(),"My order",MagicNumber,0,clrGreen);
    }
    
    if ( eventBuyClosed_TP > 0 ) {
        Alert( _Symbol, OrderClosePrice(), ": Buy-позиция закрыта по ТейкПрофиту!" );
        deleteAllPaddingOrders();
    }
    
    if ( eventSellClosed_SL > 0 ) {
        Alert( _Symbol, OrderClosePrice(), ": Sell-позиция закрыта по СтопЛоссу!" );
        double minstoplevel=MarketInfo(Symbol(),MODE_STOPLEVEL);
        Alert("Минимальный стоп левел: ", minstoplevel);
        OrderSend(_Symbol,OP_SELLSTOP,OrderLots(),OrderOpenPrice(),3,OrderStopLoss(),OrderTakeProfit(),"My order",MagicNumber,0,clrRed);
    }
    
    if ( eventSellClosed_TP > 0 ) {
        Alert( _Symbol, OrderClosePrice(), ": Sell-позиция закрыта по ТейкПрофиту!" );
        deleteAllPaddingOrders();
    }
    
    if ( eventBuyLimitOpened > 0 || eventBuyStopOpened > 0 || 
          eventSellLimitOpened > 0 || eventSellStopOpened > 0 )
        Alert( _Symbol, OrderType(), ": сработал отложенный ордер!" );
return(0);
}
//-----------------------------------------------------------------+
void deleteAllPaddingOrders() {
  int total = OrdersTotal();
  for(int i=total-1;i>=0;i--)
  {
    OrderSelect(i, SELECT_BY_POS);
    int type   = OrderType();
    if (OrderMagicNumber() != MagicNumber) continue;
    if (OrderSymbol() != _Symbol) continue;
    bool result = false;
    
    switch(type)
    {
      //Close opened long positions
      case OP_BUY       : result = OrderClose( OrderTicket(), OrderLots(), MarketInfo(OrderSymbol(), MODE_BID), 5, Red );
                          break;
      
      //Close opened short positions
      case OP_SELL      : result = OrderClose( OrderTicket(), OrderLots(), MarketInfo(OrderSymbol(), MODE_ASK), 5, Red );
      //                    break;

      //Close pending orders
      //case OP_BUYLIMIT  :
      //case OP_SELLLIMIT :
      case OP_BUYSTOP   :
      case OP_SELLSTOP  : result = OrderDelete( OrderTicket() );
    }
    
    if(result == false)
    {
      Alert("Order " , OrderTicket() , " failed to close. Error:" , GetLastError() );
      Sleep(3000);
    }
    return;
  }
  
  return;
}
void sendOrders(bool isFirst) {
   //--- получим минимальное значение Stop level
   double minstoplevel=MarketInfo(Symbol(),MODE_STOPLEVEL);
   Print("Minimum Stop Level=",minstoplevel," points");
   //--- BUYSTOP
   //--- вычисленные значения цен SL и TP должны быть нормализованы
   //--- размещаем рыночный ордер на покупку 1 лота
   int ticketBuyStop, ticketSellStop;
   if(!isFirst) {
      ticketBuyStop=OrderSend(Symbol(),OP_BUYSTOP,1,Ask + padding * Point,20,Bid -padding*Point,Ask + padding * Point,"My order",MagicNumber,0,clrGreen);
      ticketSellStop=OrderSend(Symbol(),OP_SELLSTOP,1,Bid - padding * Point,20,Ask + padding*Point,Bid - padding * Point,"My order",MagicNumber,0,clrRed);
   } else { 
      ticketBuyStop=OrderSend(Symbol(),OP_BUYSTOP,1,max + padding * Point,20,min -padding*Point,max + (max - min + padding) * Point,"My order",MagicNumber,0,clrGreen);
      ticketSellStop=OrderSend(Symbol(),OP_SELLSTOP,1,min - padding * Point,20,max + padding*Point,min - (max - min  + padding)*Point,"My order",MagicNumber,0,clrRed);
   }
   if(ticketBuyStop<0)
     {
     Print("OrderSend завершилась с ошибкой #",GetLastError());
      
         deleteAllPaddingOrders();
         if(a <=5) {
         //sendOrders(isFirst);
         a= a+1;
      }
     }
   else
      Print("Функция OrderSend успешно выполнена");
   //---BUYSTOP
   
   //---SELLSTOP
   //--- вычисленные значения цен SL и TP должны быть нормализованы
   //--- размещаем рыночный ордер на покупку 1 лота
   
   if(ticketSellStop<0)
     {
      
         deleteAllPaddingOrders();
         if(a <= 5) {
            //sendOrders();
            a= a+1;
            Print("a", a);
         }
         Print("OrderSend завершилась с ошибкой #",GetLastError());
       
     }
   else
      Print("Функция OrderSend успешно выполнена");
   //---SELLSTOP
   return;
}
bool getMaxMin() {
   int startIndex = iBarShift(_Symbol, 0, StrToTime(startTime), true);
   min=iLow(NULL,0,iLowest(NULL,0,MODE_LOW,startIndex,0));
   max=iHigh(NULL,0,iHighest(NULL,0,MODE_HIGH,startIndex,0));
   Alert("Min: ", min);
   Alert("Max: ", max);
   sendOrders(true);
   return true;
}

//===============================================================================+
//======| возвращает true если временной диапозон кончился                       |
//===============================================================================+
bool isTime() {
   if (TimeHour(StrToTime(startTime)) == Hour() && TimeMinute(StrToTime(startTime)) == Minute() && isEndTime) { Alert("Start Timeline"); isEndTime = false; deleteAllPaddingOrders();};
   if(TimeHour(StrToTime(endTime)) == Hour() && TimeMinute(StrToTime(endTime)) <= Minute() && !isEndTime) { Alert("End Timeline"); isEndTime = true; return true;};
   return false;
}

//=====================================================================+
//======| возвращает true если появился новый бар, иначе false |
//=====================================================================+
//bool isNewBar()
//{
//bool res=false;
//if(expertBars!=iBars(Symbol(),0))
//{
//expertBars=iBars( Symbol (),0);
//res=true;
//}
//return(res);
//}
 
Sobbaka:

Es besteht keine Notwendigkeit, Fragen in verschiedenen Threads zu duplizieren.

 

Guten Tag!

Beim Testen im Log erhalte ich OrderSend error 130 - wenn ich es richtig verstehe, kann es nur mit Stops oder Strokes zusammenhängen, bitte prüfen Sie, was falsch ist:

#define  MagicNumber1 100            //Buy
input double MaximumRisk=0.03;      //Max риск в сделке
 input double K=1;                   //Коэффициент риск к прибыли
input int OrderPoint=30;            //Расстояние до отложенного ордера
double Price=0;                     //Цена для установки отложенного ордера
double SL=0;                        //Stop Loss
double TP=0;                        //Take Profit
double Lots=0;                      //Просчет лотности исходя из max риска одной сделки


void OnTick()
{
//Параметры для открытия ордера                   
Price = NormalizeDouble(High[1]+OrderPoint*Point,Digits); //Цена открытия ордера
SL = NormalizeDouble(Low[1]-Point,Digits); //Стоп лосс
if ((Price-SL)<NormalizeDouble(MarketInfo(Symbol(),MODE_STOPLEVEL)*Point,Digits))
{SL=Price-NormalizeDouble(MarketInfo(Symbol(),MODE_STOPLEVEL)*Point,Digits);}
TP = NormalizeDouble((Price-SL)*K+Price,Digits); //Тэйк профит
//Просчет лотности исходя из риска в сделке
Lots = NormalizeDouble(((AccountBalance()*MaximumRisk/100.0)/((Price-SL)*1000.0)),1);

//Установка отложенного ордера
bool send1=OrderSend(Symbol(),OP_BUYSTOP,Lots,Price,3,SL,TP,"comment",MagicNumber1,0,clrGreen);
}
 
YanSay:

Guten Tag!

Beim Testen im Log gibt es einen Fehler OrderSend error 130 - wenn ich das richtig verstehe, kann das nur mit Stops oder Strokes zusammenhängen,

Auch die offenen Preise der schwebenden Aufträge sind davon betroffen. Deshalb müssen wir den Abstand zwischen dem aktuellen Marktpreis und dem Eröffnungskurs des Auftrags überprüfen. In diesem Fall: Preis - Fragen.

 
Ihor Herasko:

Der Eröffnungskurs von schwebenden Aufträgen gilt ebenfalls. Daher sollten wir auch den Abstand zwischen dem aktuellen Marktpreis und dem Eröffnungskurs des Auftrags überprüfen. In diesem Fall: Preis - Fragen.

Ich danke Ihnen!
 
Artyom Trishkin:
Was gibt die Funktion Hour() zurück?

Gibt die aktuelle Stunde zurück. So gehe ich vor: Wenn die aktuelle Stunde größer als 11 und kleiner als 17 ist,

if(Hour()>=17&&Hour()<=11)continue;

aber wie?

 
Tigerfreerun:

Das ist ein bisschen kompliziert für mich. Könnten Sie erklären, in welchem Teil des Codes hinzufügen und was bedeutet es mn und mag_n? wo sollte ich meine EA medjic hier setzen?

Bevor Sie Ihre Bedingung stellen

if(Hour()>=0&&Hour()<=8&&!OP_TO(mag_n))step = 5; else step =10;

mag_n - wo setze ich mein EA's IG hier ein?

 
PolarSeaman:

Ich schreibe: Wenn die aktuelle Stunde mehr als 11 und weniger als 17 Uhr beträgt, wie soll sie dann sein?

Ich verstehe, dass sich die Frage auf den Indikator bezieht. StattHour() -> time[i]

 
Vitaly Muzichenko:

Ich verstehe, dass sich die Frage auf den Indikator bezieht. Anstelle vonHour() -> time[i].

Ja, du hast mir geholfen, jetzt möchte ich die Zeit begrenzen. Ausgenommen ist die Zählung von 17.00 bis 23.00 Uhr.

  for(int i=limit-2; i>0; i--) 
     {
     if(Hour()>=17&&Hour()<=11)continue;
      if(i%2==0) 
        {
         if(open[i]<close[i] && open[i+1]>close[i+1]) 
           {
            k1++;
           // if(k1>max) {max=k1; dat_max=time[i];}
            if(k1>=4)Print("Num: ",k1,"dat_max ",time[i]);
            SetText("Obj_"+(string)time[i],(string)k1,time[i],high[i],Arr);
           }
         else k1=0;
         
           } else {
         if(open[i]<close[i] && open[i+1]>close[i+1]) 
           {
            k2++;
            //if(k2>max){ max=k2; dat_max=time[i];}
            if(k2>=4)Print("Num: ",k2,"dat_max ",time[i]);
            SetText("Obj_"+(string)time[i],(string)k2,time[i],high[i],Arr);
           }
         else k2=0;
         
        }
      
     }
Grund der Beschwerde: