Geradengleichung

 

Hallo, 


Die Geradengleichung ist ja bekanntlich

f(x) = k*x+d

wenn ich das jetzt auf eine Trennlinie umlege, damit ich zu einer Zeit x den Wert auslesen kann wenn ich 2 Punkte habe, wäre das dann

auf der 

x-Achse = die Zeit

y-Achse = der Preis

d = Der Startpunkt

f(x) = der Aktuelle Preis

auf k komme ich ja normalerweise mi

(Y2-Y1) / (X2 - X1)


das wäre dann

f(x) = ((Y2-Y1) / (X2 - X1)) * TimeCurrent() + Startpreispunkt


und dann bekomme ich eigenartige Werte Raus

ich hab das mal zum Testen in einen EA gepackt, aber vielleicht ist ja auch nur der Gedanke zu meiner Berechnung falsch

//+------------------------------------------------------------------+
//|                                                         1111.mq5 |
//|                        Copyright 2020, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2020, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+

input string Trendline = "H1 Trendline 50343";

//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int OnInit()
  {
//---
 string firstbuy, secondbuy;
   double  nowprice, nextprice;
   datetime nowtime, nexttime;
   if(FileIsExist("TrendBuy" + _Symbol + ".csv"))
     {

      int file_handle=FileOpen("TrendBuy"+_Symbol+".csv",FILE_READ|FILE_CSV);
      if(file_handle!=INVALID_HANDLE)
        {
         while(!FileIsEnding(file_handle))
           {
            firstbuy  = FileReadString(file_handle,-1);
            secondbuy = FileReadString(file_handle,-1);
           }
         FileClose(file_handle);
        }
     }

    int startsearchbuy=  StringFind(firstbuy,";",0);
    

    nowtime  = StringToTime(StringSubstr(firstbuy,startsearchbuy+1,-1));
    nexttime = StringToTime(StringSubstr(secondbuy,startsearchbuy+1,-1));
    
    nowprice = StringToDouble(StringSubstr(firstbuy,0,startsearchbuy));
    nextprice= StringToDouble(StringSubstr(secondbuy,0,startsearchbuy));
  

   //Print(nowtime, " ", nexttime," ", nowprice," ", nextprice);
  
    double k = (nextprice-nowprice)/(nexttime-nowtime) ;
    double price = k*TimeCurrent() + nowprice;
    
    Print(k);
    Print(k*TimeCurrent());
  
    Print(NormalizeDouble(price,_Digits)," ",ObjectGetDouble(0,Trendline,OBJPROP_PRICE));
  
//---
   return(INIT_SUCCEEDED);
  }



void OnChartEvent(const int id,
                  const long &lparam,
                  const double &dparam,
                  const string &sparam)
  {

   ResetLastError();

   if(id==CHARTEVENT_OBJECT_DRAG)
     {
      MqlRates rates[];
      ArraySetAsSeries(rates, true);
      int copy =  CopyRates(_Symbol,0,0,100,rates);
    
      double now =  NormalizeDouble(ObjectGetValueByTime(0,Trendline,rates[0].time,0),_Digits);
      double next = NormalizeDouble(ObjectGetValueByTime(0,Trendline,rates[0].time+PeriodSeconds()*50,0),_Digits);

  // Print(next, " ", now);
      datetime timenow =  rates[0].time;
      datetime timenext = rates[0].time+PeriodSeconds()*50;
//Print(timenext, " ", timenow);

      if(FileIsExist("TrendBuy" + _Symbol + ".csv"))
         FileDelete("TrendBuy" + _Symbol + ".csv");

      int h = FileOpen("TrendBuy" + _Symbol + ".csv", FILE_READ | FILE_WRITE | FILE_CSV);
      if(h != INVALID_HANDLE)
        {
         FileWriteString(h,(string)now +";"+ (string)timenow +"\r\n");
         FileWriteString(h,(string)next+";"+ (string)timenext+"\r\n");
        }
      FileClose(h);

     }

  }
//+------------------------------------------------------------------+
 

Ich würde die Zeit und Preisdifferenzen in Punkte und Bars umrechnen. Also Y2-Y1 = 567 Punkte und X2-X1 = 3 Bars.

Du kannst auch nicht TimeCurrent() nehmen, da ist 0 bei 1.1.970 (oder so), Dein Nullpunkt liegt bei X1.

Aber schau mal hier: https://www.mql5.com/de/code/11077 ich glaube das gibt es das schon. Aber such mal (auf Englisch) nach linear function.

ALGLIB - Numerische Analyse Bibliothek
ALGLIB - Numerische Analyse Bibliothek
  • www.mql5.com
ALGLIB Math. Funktionen Bibliothek (v. 3.5.0) portiert auf MQL4.
 
amando:

das wäre dann

f(x) = ((Y2-Y1) / (X2 - X1)) * TimeCurrent() + Startpreispunkt

Wie Carl bereits schrieb, die Gerade soll ja nicht beim 1.1.1970 starten. In die Gleichung wird die Zeit ab dem Ursprung der Geraden eingetragen. Vom Startzeitpunkt bis jetzt.

Also:  f(x) = ((Y2-Y1) / (X2 - X1)) * (TimeCurrent() - Startzeitpunkt) + Startpreispunkt

 
lippmaje:

Wie Carl bereits schrieb, die Gerade soll ja nicht beim 1.1.1970 starten. In die Gleichung wird die Zeit ab dem Ursprung der Geraden eingetragen. Vom Startzeitpunkt bis jetzt.

Also:  f(x) = ((Y2-Y1) / (X2 - X1)) * (TimeCurrent() - Startzeitpunkt) + Startpreispunkt

Danke, genau das war der fehler