Metatrader Forum | Forex Expert-Advisor | Broker & Forex Tools
Zurück   Metatrader Forum | Forex Expert-Advisor | Broker & Forex Tools > Metatrader 4 > Programmierung MQL4

Programmierung MQL4 Hier gehts rund ums Programmieren in MQL4.

Login
Benutzername:
Kennwort:


Statistik
Themen: 4973
Beiträge: 43251
Benutzer: 7.219
Aktive Benutzer: 81
Links: 84
Wir begrüßen unseren neuesten Benutzer: Hopfen&Malz
Mit 2.475 Benutzern waren die meisten Benutzer gleichzeitig online (16.01.20 um 22:38).
Neue Benutzer:
vor einem Tag
- Hopfen&Mal...
vor 2 Tagen
- frankmicha...
vor einer Woche
- DFeck
vor einer Woche
- bb1107
vor 2 Wochen
- rg-trader

Onlineuser
'Wer ist online' anzeigen Benutzer: 0
Gäste: 250
Gesamt: 250
Team: 0
Team:  
Benutzer:  
Freunde anzeigen

Empfehlungen

Thema geschlossen
 
Themen-Optionen Thema durchsuchen Ansicht
  #11 (permalink)  
Alt 21.06.15
Neues Mitglied
 
Registriert seit: Mar 2015
Ort: Berlin
Beiträge: 28
saro2018 befindet sich auf einem aufstrebenden Ast
Standard

Zitat:
Zitat von traderdoc Beitrag anzeigen
Für eine BuyOrder:

if(OrderClosePrice()<=OrderStopLoss())

für eine SellOrder:

if(OrderClosePrice()>=OrderStopLoss())

oder noch sicherer im OrderComment() der Order der Historie nach den Worten sl oder tp suchen.

traderdoc
Alles klar danke dir

soweit bin ich nun auch gekommen nur die Sache ist die, an welcher stelle soll der Code eingebettet werden das ist meine Hauptproblem, weil er muss ja auch darauf reagieren. Innerhalb der Bedingungs Loop oder wo anders? Sprich wie verknüpfe ich die Bedinung.

Gruß

Aron
  #12 (permalink)  
Alt 21.06.15
Neues Mitglied
 
Registriert seit: Mar 2015
Ort: Berlin
Beiträge: 28
saro2018 befindet sich auf einem aufstrebenden Ast
Standard

Okay ich habe mal eine Sache programmiert. Sie soll checken ob die letzte Order ein Profit war oder nicht. Falls das der Fall ist, soll sie in die Condition Loop wieder rein, falls sie ein Loss war soll sie unten den Befehl ausführen (eine Order eröffnen, Gegenposition)
Der Code sieht die wie folgt aus:
Code:
double mymagicnumber = 123456;

double closedProfit = 0;


int hstTotal = OrdersHistoryTotal();
for(int i=0;i<hstTotal;i++)
{ OrderSelect(i, SELECT_BY_POS, MODE_HISTORY );
if ( OrderSymbol()==Symbol() && ( (OrderMagicNumber() == mymagicnumber)))
{closedProfit = closedProfit + OrderProfit();
}
} if (closedProfit>=0)
//[...my conditions]
//[am ende der Loop]
if (closedProfit<0)
{
if(total<1)
for(i=0;i<hstTotal;i++)
{   OrderSelect(i, SELECT_BY_POS, MODE_HISTORY );
if ( OrderType()==OP_BUY && ( (OrderMagicNumber() == mymagicnumber)))
{OrderSend(Symbol(),OP_SELL,Lots,Bid,2,StopLoss,TakeProfit,NULL,mymagicnumber);
}
if ( OrderType()==OP_SELL && ( (OrderMagicNumber() == mymagicnumber)))
{OrderSend(Symbol(),OP_BUY,Lots,Ask,2,StopLoss,TakeProfit,NULL,mymagicnumber);
}
} } 

return(0);
      }
Da müsste ein kleiner Logikfehler drin sein.

Gruß Aron
  #13 (permalink)  
Alt 22.06.15
Neues Mitglied
 
Registriert seit: Mar 2015
Ort: Berlin
Beiträge: 28
saro2018 befindet sich auf einem aufstrebenden Ast
Unhappy

Zitat:
Zitat von saro2018 Beitrag anzeigen
Okay ich habe mal eine Sache programmiert. Sie soll checken ob die letzte Order ein Profit war oder nicht. Falls das der Fall ist, soll sie in die Condition Loop wieder rein, falls sie ein Loss war soll sie unten den Befehl ausführen (eine Order eröffnen, Gegenposition)
Der Code sieht die wie folgt aus:
Code:
double mymagicnumber = 123456;

double closedProfit = 0;


int hstTotal = OrdersHistoryTotal();
for(int i=0;i<hstTotal;i++)
{ OrderSelect(i, SELECT_BY_POS, MODE_HISTORY );
if ( OrderSymbol()==Symbol() && ( (OrderMagicNumber() == mymagicnumber)))
{closedProfit = closedProfit + OrderProfit();
}
} if (closedProfit>=0)
//[...my conditions]
//[am ende der Loop]
if (closedProfit<0)
{
if(total<1)
for(i=0;i<hstTotal;i++)
{   OrderSelect(i, SELECT_BY_POS, MODE_HISTORY );
if ( OrderType()==OP_BUY && ( (OrderMagicNumber() == mymagicnumber)))
{OrderSend(Symbol(),OP_SELL,Lots,Bid,2,StopLoss,TakeProfit,NULL,mymagicnumber);
}
if ( OrderType()==OP_SELL && ( (OrderMagicNumber() == mymagicnumber)))
{OrderSend(Symbol(),OP_BUY,Lots,Ask,2,StopLoss,TakeProfit,NULL,mymagicnumber);
}
} } 

return(0);
      }
Da müsste ein kleiner Logikfehler drin sein.

Gruß Aron



Keiner einen Ansatz für mein Problem?

Gruß

Aron
  #14 (permalink)  
Alt 22.06.15
Elite Mitglied
 
Registriert seit: Apr 2011
Beiträge: 2.733
traderdoc befindet sich auf einem aufstrebenden Ast
Standard

Code:
int ticket;
double closedProfit = 0;
int hstTotal = OrdersHistoryTotal();

for(int i = 0; i < hstTotal; i++) { 
   if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY)) {
      if (OrderSymbol() == Symbol() && OrderMagicNumber() == mymagicnumber) {
         closedProfit = closedProfit + OrderProfit();
      }
   }
}

if (closedProfit>=0) {
   //[...my conditions]
   //[am ende der Loop]
}

if (closedProfit < 0) {
   if(total < 1) {          //was soll total sein???
      for(i = 0; i < hstTotal; i++) {   
         if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY) {
            if (OrderType() == OP_BUY && OrderMagicNumber() == mymagicnumber){
               ticket = OrderSend(Symbol(), OP_SELL, Lots, Bid, 2, StopLoss, TakeProfit, NULL, mymagicnumber);
            }
            if (OrderType() == OP_SELL && OrderMagicNumber() == mymagicnumber{
               ticket = OrderSend(Symbol(), OP_BUY, Lots, Ask, 2, StopLoss, TakeProfit, NULL, mymagicnumber);
            }
         }
      }
   } 
}
So, habe mal den Code etwas geordnet. Das solltest Du Dir von vorn herein angewöhnen.
Die Logik im unteren Teil erschließt sich mir zwar nicht, aber Du wirst schon Deine Gründe haben.
Ansonsten solltest Du nochmals ganz knapp darlegen, was genau!! gemacht werden soll.

traderdoc
__________________
Ich erfülle Euch gern Eure EA-, Indikator- und Script-Programmierungswünsche auf Honorarbasis.
  #15 (permalink)  
Alt 22.06.15
Neues Mitglied
 
Registriert seit: Mar 2015
Ort: Berlin
Beiträge: 28
saro2018 befindet sich auf einem aufstrebenden Ast
Standard

Zitat:
Zitat von traderdoc Beitrag anzeigen
Code:
int ticket;
double closedProfit = 0;
int hstTotal = OrdersHistoryTotal();

for(int i = 0; i < hstTotal; i++) { 
   if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY)) {
      if (OrderSymbol() == Symbol() && OrderMagicNumber() == mymagicnumber) {
         closedProfit = closedProfit + OrderProfit();
      }
   }
}

if (closedProfit>=0) {
   //[...my conditions]
   //[am ende der Loop]
}

if (closedProfit < 0) {
   if(total < 1) {          //was soll total sein???
      for(i = 0; i < hstTotal; i++) {   
         if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY) {
            if (OrderType() == OP_BUY && OrderMagicNumber() == mymagicnumber){
               ticket = OrderSend(Symbol(), OP_SELL, Lots, Bid, 2, StopLoss, TakeProfit, NULL, mymagicnumber);
            }
            if (OrderType() == OP_SELL && OrderMagicNumber() == mymagicnumber{
               ticket = OrderSend(Symbol(), OP_BUY, Lots, Ask, 2, StopLoss, TakeProfit, NULL, mymagicnumber);
            }
         }
      }
   } 
}
So, habe mal den Code etwas geordnet. Das solltest Du Dir von vorn herein angewöhnen.
Die Logik im unteren Teil erschließt sich mir zwar nicht, aber Du wirst schon Deine Gründe haben.
Ansonsten solltest Du nochmals ganz knapp darlegen, was genau!! gemacht werden soll.

traderdoc
Vielen Dank, für die Antwort. Also im Allgemeinen möchte ich, dass der EA checken soll, ob der letzte Trade ein Profit oder ein Loss ist.
Wenn der Trade ein Loss ist (wie unten), dann soll er eine Position sofort in Gegenrichtung eröffnen. Mit total ist gemeint, dass er zudem checken soll, ob sich schon eine Order im Markt befindet. Wenn dies der Fall ist, soll er keine neue eröffnen. Also immer nur eine Positition im Markt.

Gruß Aron
  #16 (permalink)  
Alt 22.06.15
Elite Mitglied
 
Registriert seit: Apr 2011
Beiträge: 2.733
traderdoc befindet sich auf einem aufstrebenden Ast
Standard

Code:
int ticket;
double closedProfit;
int lastorder;
int hstTotal = OrdersHistoryTotal();

for(int i = hstTotal -1; i >= 0; i--) { 
   if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY)) {
      if (OrderSymbol() == Symbol() && OrderMagicNumber() == mymagicnumber) {
         closedProfit = OrderProfit();
         lastorder = OrderType();
         break;
      }
   }
}

if (closedProfit>=0) {
   //[...my conditions]
   //[am ende der Loop]
}

if (closedProfit < 0) {
   if(total < 1) {          //was soll total sein???
      if (lastorder == 0) {
         ticket = OrderSend(Symbol(), OP_SELL, Lots, Bid, 2, StopLoss, TakeProfit, NULL, mymagicnumber);
      }
      if (lastorder == 1) {
         ticket = OrderSend(Symbol(), OP_BUY, Lots, Ask, 2, StopLoss, TakeProfit, NULL, mymagicnumber);
      }
   } 
}
Auf die Schnelle hingeschrieben, ohne zu testen.

traderdoc
__________________
Ich erfülle Euch gern Eure EA-, Indikator- und Script-Programmierungswünsche auf Honorarbasis.
  #17 (permalink)  
Alt 23.06.15
Neues Mitglied
 
Registriert seit: Mar 2015
Ort: Berlin
Beiträge: 28
saro2018 befindet sich auf einem aufstrebenden Ast
Standard

Zitat:
Zitat von traderdoc Beitrag anzeigen
Code:
int ticket;
double closedProfit;
int lastorder;
int hstTotal = OrdersHistoryTotal();

for(int i = hstTotal -1; i >= 0; i--) { 
   if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY)) {
      if (OrderSymbol() == Symbol() && OrderMagicNumber() == mymagicnumber) {
         closedProfit = OrderProfit();
         lastorder = OrderType();
         break;
      }
   }
}

if (closedProfit>=0) {
   //[...my conditions]
   //[am ende der Loop]
}

if (closedProfit < 0) {
   if(total < 1) {          //was soll total sein???
      if (lastorder == 0) {
         ticket = OrderSend(Symbol(), OP_SELL, Lots, Bid, 2, StopLoss, TakeProfit, NULL, mymagicnumber);
      }
      if (lastorder == 1) {
         ticket = OrderSend(Symbol(), OP_BUY, Lots, Ask, 2, StopLoss, TakeProfit, NULL, mymagicnumber);
      }
   } 
}
Auf die Schnelle hingeschrieben, ohne zu testen.

traderdoc
Hallo, vielen Dank für deine schnelle Antwort. Ich soeben den von dir umgeänderten Code bei mir im EA eingefügt. Allerdings ist das Problem immernoch vorhanden. Der EA verkauft bzw. kauft leider immernoch nicht sobald ein Trade mit Verlust geschlossen wurde. Woran könnte das liegen?

Gruß Aron

Hier nochmal als Anhang der Teil meines EAs, wo die Bedingung drin stehen:
Code:
 
 
double mymagicnumber = 123456;


double closedProfit;
int lastorder;
int hstTotal = OrdersHistoryTotal();

for(int i = hstTotal -1; i >= 0; i--) { 
   if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY)) {
      if (OrderSymbol() == Symbol() && OrderMagicNumber() == mymagicnumber) {
         closedProfit = OrderProfit();
         lastorder = OrderType();
         break;
      }
   }
}
  
//---- detect trading signal ---------------------------------------------------------------+
double close = NormalizeDouble(iClose(NULL,0,0),digits);
double open  = NormalizeDouble(iOpen(NULL,0,0),digits); 
double o  =  NormalizeDouble(Upper,digits);
double u =  NormalizeDouble(Lower,digits);

total=OrdersTotal();
if(total<1)
{

static  datetime    tradingAllowed;
int newCount = HistoryTotal();  static  int prevCount;
if (newCount != prevCount){                 prevCount = newCount;
    datetime lastClose;
    for(int pos=newCount-1; pos >= 1; pos--) if (
        OrderSelect(pos, SELECT_BY_POS, MODE_HISTORY)  
    &&  OrderCloseTime()    > lastClose               
    &&  OrderTicket()  == ticket           
    &&  OrderSymbol()       == Symbol()                 
    &&  OrderType()         <= OP_SELL){   
        lastClose = OrderCloseTime();
    }
    datetime lastClosePlus24Hrs = lastClose + 2* 3600;
    tradingAllowed = lastClosePlus24Hrs;
}
if (TimeCurrent() <= tradingAllowed) return(0);


 if(AccountFreeMargin()<(1000*Lots))
 {Print("We have no money. Free Margin = ", AccountFreeMargin());
 return(0);
 }
 //check for long position
if (closedProfit>=0)
{  
if (iOpen(NULL,0,0) > u && iClose(NULL,0,0) < u)
   {
        RefreshRates();                        // Refresh rates
       
         SL=Bid + main_sl;     // Calculating SL of opened
         TP=Bid - main_tp;   // Calculating TP of opened
         
        ticket=OrderSend(Symb,OP_SELL,Lts,Bid,2,SL,TP,NULL,123456); 
        if(ticket>0)
        {
        if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)) Print("BUY order opened : ",OrderOpenPrice());
        }
        else Print("Error opening BUY order : ",GetLastError());
        return(0);
        }                           // Criterion for opening Sell 

if (iOpen(NULL,0,0) < o  && iClose(NULL,0,0) > o)
   {
        RefreshRates();                        // Refresh rates
             
         SL=Ask - main_sl;     // Calculating SL of opened
         TP=Ask + main_tp;
         
       ticket=OrderSend(Symb,OP_BUY,Lts,Ask,2,SL,TP,NULL,123456);  
       if(ticket>0)
        {
        if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)) Print("SELL order opened : ",OrderOpenPrice());
        }
        else Print("Error opening SELL order : ",GetLastError());
        return(0);
        } 
 }       

// Criterion for opening Sell 

if (closedProfit < 0) {
  // if(total < 1) {          //was soll total sein???
      if (lastorder == 0) {
         ticket = OrderSend(Symbol(), OP_SELL, Lots, Bid, 2, StopLoss, TakeProfit, NULL, mymagicnumber);
      }
      if (lastorder == 1) {
         ticket = OrderSend(Symbol(), OP_BUY, Lots, Ask, 2, StopLoss, TakeProfit, NULL, mymagicnumber);
      }
   } 

 
        
        

return(0);
      }






int maxDuration = 20 * 60; // 20 minutes
for(int posi = OrdersTotal()-1; posi >= 0 ; posi--) if (
    OrderSelect(posi, SELECT_BY_POS)            // Only my orders w/
&&  OrderMagicNumber() == 123456        // my magic number
&&  OrderSymbol()      == Symbol() ){               // and period and symbol
    int duration = TimeCurrent() - OrderOpenTime();
    if (duration >= maxDuration)
    OrderClose(OrderTicket(), OrderLots(), OrderClosePrice(),
                2 * my_point);    
}


return(0);
}
  #18 (permalink)  
Alt 23.06.15
Elite Mitglied
 
Registriert seit: Apr 2011
Beiträge: 2.733
traderdoc befindet sich auf einem aufstrebenden Ast
Standard

Das kann nicht der ganze Code sein, denn der wäre nur mit Fehlern compilierbar. (z.B. total nicht deklariert, Benutzung von return(0) ohne Einsprungpunkt). Entscheidend für die Lebensdauer der Variablen ist der Ort der Deklaration.

Desweiteren baue an markanten Stellen die Funktion
Print() ein. In der Klammer dann Ausdrücke, die angezeigt werden sollen, z.B. Variablen oder Ergebnisse von Berechnungen oder Rückgabewerte von Funktionen.
Zur reinen Verfolgung, wo der EA hinläuft, reicht es auch aus zu schreiben:
Print("T");
Erscheint dann das T im Reiter Journal oder ExpertAdvisor, dann weißt Du, dass er da lang gelaufen ist.
So kannst Du immer weiter einengen, bis Du die Stelle gefunden hast, an der es lag.

traderdoc
__________________
Ich erfülle Euch gern Eure EA-, Indikator- und Script-Programmierungswünsche auf Honorarbasis.
  #19 (permalink)  
Alt 23.06.15
Neues Mitglied
 
Registriert seit: Mar 2015
Ort: Berlin
Beiträge: 28
saro2018 befindet sich auf einem aufstrebenden Ast
Standard

Zitat:
Zitat von traderdoc Beitrag anzeigen
Das kann nicht der ganze Code sein, denn der wäre nur mit Fehlern compilierbar. (z.B. total nicht deklariert, Benutzung von return(0) ohne Einsprungpunkt). Entscheidend für die Lebensdauer der Variablen ist der Ort der Deklaration.

Desweiteren baue an markanten Stellen die Funktion
Print() ein. In der Klammer dann Ausdrücke, die angezeigt werden sollen, z.B. Variablen oder Ergebnisse von Berechnungen oder Rückgabewerte von Funktionen.
Zur reinen Verfolgung, wo der EA hinläuft, reicht es auch aus zu schreiben:
Print("T");
Erscheint dann das T im Reiter Journal oder ExpertAdvisor, dann weißt Du, dass er da lang gelaufen ist.
So kannst Du immer weiter einengen, bis Du die Stelle gefunden hast, an der es lag.

traderdoc
Vielen Dank schonmal, das ist nur ein Teil, oben im EA habe ich alles deklariert. Die Sache ist villeicht die Position des Codes im EA, die er wahrscheinlich nicht durchläuft, wie soll ich das einbauen mit dem Print? direkt da runter? dann print("T") zum Beispiel?


Hier der komplette EA (bis auf eine kleine Berechnung):
Code:
//--------------------------------------------------------------------
#property copyright "Copyright © 2015"
//--------------------------------------------------------------- 1 --


#define MAGICMA   16384


extern double StopLoss   =25;     // SL for an opened order
extern double TakeProfit =20;      // ТР for an opened order
extern double TrailingStop = 30;
extern double Lots       =0.1;     // Strictly set amount of lots
extern double Prots      =0.07;    // Percent of free margin
extern double Abweichung = 5;
extern int    DaysToLookBack = 15;
extern color  LineColor      = Black;
extern int    LineWidth      = 1;
extern int    LineStyle      = STYLE_DOT;
int   ShowComment    = TRUE;
extern string LineNameUpper  = "o";
extern string LineNameLower  = "u";


 
bool Work=true;                    // EA will work.
string Symb=Symbol();                       // Security name
//--------------------------------------------------------------- 2 --
//----- global variables ----------------------------------------------------------------------+
int    slippage;
int    digits, Total;
int  ticket, total, tip=-1;
double point;
int    my_digits;
double my_point;
int    pips_digits;
int    lots_digits;
double Min_Lot;
double Lot;

double maxlots, Free, One_Lot, Step, Lts, SL, TP,K;
string symbol;
double risk;
double maxSpreadWithCommission;
double rangeFilter;
bool   gotCommissionPointsFromTrade;
double commissionPoints;
double spreadHistory[30];
int    spreadHistoryCount = 0;
string objname_hline;
bool   is_testing;
double main_sl;
double main_tp;
double OP;
double main_be_profit;
double main_be_offset;
static int      account_number;
static bool     is_ok;
bool
   Ans  =false,                     // Server response after closing
   Cls_B=false,                     // Criterion for closing Buy
   Cls_S=false,                     // Criterion for closing Sell
   Opn_B=false,                     // Criterion for opening Buy
   Opn_S=false;                     // Criterion for opening Sell


int init()
{
            ArrayInitialize(spreadHistory,0.0);
            is_testing = IsTesting();
            symbol = Symbol();
            digits = Digits;
            point  = Point;
            ticket = OrderTicket();
            tip    = OrderType();
            Lot    = OrderLots();
            SL    =OrderStopLoss();
            TP    =OrderTakeProfit();
            Total =OrdersTotal();
    if(digits == 0)
     {
            my_point  = 1.0;
            my_digits = 0;
     }
   else
     {
      if(digits < 2)
        {
            my_point  = 0.1;
            my_digits = 1;
        }
      else
        {
         if(digits < 4)
           {
            my_point  = 0.01;
            my_digits = 2;
           }
         else
           {
            my_point  = 0.0001;
            my_digits = 4;
           }
        }
     }
   if(StringFind(symbol,"XAU") >= 0 || StringFind(symbol,"GOLD") >= 0)
     {
      my_point  = 0.1;
      my_digits = 1;
     }
   else
     {
      if(StringFind(symbol,"XAG") >= 0 || StringFind(symbol,"SILVER") >= 0)
        {
         my_point  = 0.01;
         my_digits = 2;
        }
     }
    pips_digits = digits - my_digits;
   double correction = MathPow(10,pips_digits);

 //  Lots = NormalizeDouble(Lots,lots_digits);

   main_sl = NormalizeDouble(my_point * StopLoss,digits);
   main_tp = NormalizeDouble(my_point * TakeProfit,digits);
   OP      = NormalizeDouble(my_point * Abweichung,digits);
   
  
return(0);  
}
//---------------------------------------------------------------------------------------------+
//---- deinit ---------------------------------------------------------------------------------+
//---------------------------------------------------------------------------------------------+
int deinit()
  {
   if(ShowComment) Comment("");
    if (ShowComment) Comment("");
  ObjectDelete(LineNameUpper);
  ObjectDelete(LineNameLower);
  ObjectDelete("ObjName33");
  ObjectDelete("ObjName213");
   return(0);
  }
  
//---------------------------------------------------------------------------------------------+
//---- start ----------------------------------------------------------------------------------+
//---------------------------------------------------------------------------------------------+
int start()
  {
  
//

[Berechnungen für die Upper und Lower Range (diese Funktioniert)]


   
   if (ObjectFind(LineNameUpper)<0) DrawLine(LineNameUpper, Upper);  
    else ObjectMove(LineNameUpper,0,TimeCurrent(),Upper);
   if (ObjectFind(LineNameLower)<0) DrawLine(LineNameLower, Lower);
    else ObjectMove(LineNameLower,0,TimeCurrent(),Lower);

  
   ObjectCreate("ObjName33", OBJ_TEXT, 0, TimeCurrent(),DoubleToStr(Upper,Digits));
   ObjectSetText("ObjName33","   o STB: "+DoubleToStr(Upper,Digits),10, "Verdana", DarkGray);
   ObjectSet("ObjName33", OBJPROP_CORNER, 0);
   ObjectSetInteger(0,"ObjName33",OBJPROP_ANCHOR,ANCHOR_LEFT);
   
   ObjectCreate("ObjName213", OBJ_TEXT, 0, TimeCurrent(),DoubleToStr(LowerDigits));
   ObjectSetText("ObjName213","   u STB: "+DoubleToStr(Lower,Digits),10, "Verdana", DarkGray);
   ObjectSet("ObjName213", OBJPROP_CORNER, 0);
   ObjectSetInteger(0,"ObjName213",OBJPROP_ANCHOR,ANCHOR_LEFT);
   
//--------------------------------------------------------------- 7 --
   // Order value
   RefreshRates();                              // Refresh rates
   Min_Lot=MarketInfo(NULL,MODE_MINLOT);        // Minimal number of lots  
   Free   =AccountFreeMargin();                 // Free margin
   One_Lot=MarketInfo(NULL,MODE_MARGINREQUIRED);// Price of 1 lot
   Step   =MarketInfo(NULL,MODE_LOTSTEP);       // Step is changed
 
   if (Lots < 0)                                // If lots are set,
      Lts =Lots;                                // work with them
   else                                         // % of free margin
      Lts=MathFloor(Free*Prots/One_Lot/Step)*Step;// For opening
 
   if(Lts > Min_Lot) Lts=Min_Lot;               // Not less than minimal
   if (Lts*One_Lot > Free)                      // Lot larger than free margin
     {
      Alert(" Not enough money for ", Lts," lots");
      return(0);                                   // Exit start()
     }

 
 
 
 
 
 
 
 
double mymagicnumber = 123456;


double closedProfit;
int lastorder;
int hstTotal = OrdersHistoryTotal();

for(int i = hstTotal -1; i >= 0; i--) { 
   if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY)) {
      if (OrderSymbol() == Symbol() && OrderMagicNumber() == mymagicnumber) {
         closedProfit = OrderProfit();
         lastorder = OrderType();
         break;
      }
   }
}
  
//---- detect trading signal ---------------------------------------------------------------+
double close = NormalizeDouble(iClose(NULL,0,0),digits);
double open  = NormalizeDouble(iOpen(NULL,0,0),digits); 
double o  =  NormalizeDouble(Upper,digits);
double u  =  NormalizeDouble(Lower,digits);

total=OrdersTotal();
if(total<1)
{

static  datetime    tradingAllowed;
int newCount = HistoryTotal();  static  int prevCount;
if (newCount != prevCount){                 prevCount = newCount;
    datetime lastClose;
    for(int pos=newCount-1; pos >= 1; pos--) if (
        OrderSelect(pos, SELECT_BY_POS, MODE_HISTORY)   // Only orders w/
    &&  OrderCloseTime()    > lastClose                 
    &&  OrderTicket()  == ticket           
    &&  OrderSymbol()       == Symbol()                 
    &&  OrderType()         <= OP_SELL){    
        lastClose = OrderCloseTime();
    }
    datetime lastClosePlus24Hrs = lastClose + 2* 3600;
    tradingAllowed = lastClosePlus24Hrs;
}
if (TimeCurrent() <= tradingAllowed) return(0);


 if(AccountFreeMargin()<(1000*Lots))
 {Print("We have no money. Free Margin = ", AccountFreeMargin());
 return(0);
 }
 //check for long position
if (closedProfit>=0)
{  
if (iOpen(NULL,0,0) > u && iClose(NULL,0,0) < u)
   {
        RefreshRates();                        // Refresh rates
       
         SL=Bid + main_sl;     // Calculating SL of opened
         TP=Bid - main_tp;   // Calculating TP of opened
         
        ticket=OrderSend(Symb,OP_SELL,Lts,Bid,2,SL,TP,NULL,123456); 
        if(ticket>0)
        {
        if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)) Print("BUY order opened : ",OrderOpenPrice());
        }
        else Print("Error opening BUY order : ",GetLastError());
        return(0);
        }                           // Criterion for opening Sell 

if (iOpen(NULL,0,0) < o  && iClose(NULL,0,0) > o)
   {
        RefreshRates();                        // Refresh rates
             
         SL=Ask - main_sl;     // Calculating SL of opened
         TP=Ask + main_tp;
         
       ticket=OrderSend(Symb,OP_BUY,Lts,Ask,2,SL,TP,NULL,123456);  
       if(ticket>0)
        {
        if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)) Print("SELL order opened : ",OrderOpenPrice());
        }
        else Print("Error opening SELL order : ",GetLastError());
        return(0);
        } 
 }       

                         // Criterion for opening Sell 

if (closedProfit < 0) {
  // if(total < 1) {          //was soll total sein???
      if (lastorder == 0) {
         ticket = OrderSend(Symbol(), OP_SELL, Lots, Bid, 2, StopLoss, TakeProfit, NULL, mymagicnumber);
      }
      if (lastorder == 1) {
         ticket = OrderSend(Symbol(), OP_BUY, Lots, Ask, 2, StopLoss, TakeProfit, NULL, mymagicnumber);
      }
   } 

 
        
        

return(0);
      }






int maxDuration = 20 * 60; // 20 minutes
for(int posi = OrdersTotal()-1; posi >= 0 ; posi--) if (
    OrderSelect(posi, SELECT_BY_POS)            // Only my orders w/
&&  OrderMagicNumber() == 123456        // my magic number
&&  OrderSymbol()      == Symbol() ){               // and period and symbol
    int duration = TimeCurrent() - OrderOpenTime();
    if (duration >= maxDuration)
    OrderClose(OrderTicket(), OrderLots(), OrderClosePrice(),
                2 * my_point);    
}


















  



return(0);
}


int New_Stop(int Parametr)                      // Checking stop levels
  {
   int Min_Dist=MarketInfo(NULL,MODE_STOPLEVEL);// Minimal distance
   if (Parametr > Min_Dist)                     // If less than allowed
     {
      Parametr=Min_Dist;                        // Sett allowed
      Alert("Increased distance of stop level.");
     }
   return(Parametr);                            // Returning value
  }


void DrawLine(string LineName,double price1) {
 ObjectCreate(LineName,OBJ_TREND,0,TimeCurrent(),price1,Time[40],price1);
 ObjectSet(LineName,OBJPROP_COLOR,LineColor);
 ObjectSet(LineName,OBJPROP_WIDTH,LineWidth);
 ObjectSet(LineName,OBJPROP_STYLE,LineStyle);
 ObjectSet(LineName,OBJPROP_RAY_RIGHT, false);
 }
  #20 (permalink)  
Alt 23.06.15
Elite Mitglied
 
Registriert seit: Apr 2011
Beiträge: 2.733
traderdoc befindet sich auf einem aufstrebenden Ast
Standard

int lastorder; solltest Du mal gegen int lastorder = -1; ersetzen.
Daran liegt es aber nicht.

Du mußt Dir überlegen, wo der EA lang laufen soll un dan den Stellen, wo Du das kontrollieren willst, schreibst Du halt Print("T"); Sollten mehrere Stellen gleichzeitig kontrolliert werden dann Print("T1");, Print("T2"); usw.Damit kannst Du dann genau unterscheiden wo, und v.a. an der Reihenfolge der Prints, wann er im Verlaufe der Abarbeitung wo langgelaufen war.

Experimentiere doch einfach mit dem Print etwas.

traderdoc
__________________
Ich erfülle Euch gern Eure EA-, Indikator- und Script-Programmierungswünsche auf Honorarbasis.
Thema geschlossen

Lesezeichen

Stichworte
mql4, oco, order, order öffnen, programmierung, programmierung metatrader

Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are aus
Pingbacks are aus
Refbacks are aus




Alle Zeitangaben in WEZ +1. Es ist jetzt 10:22 Uhr.





Suchmaschine - Reisen - Wavesnode - Facebook Forum - Spam Firewall
-----------------------------------------------------------------------------------------------------------------------------
Powered by vBulletin® Version 3.8.5 (Deutsch)
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Powered by vBCMS® 2.7.0 ©2002 - 2024 vbdesigns.de
SEO by vBSEO 3.6.1
Copyright ©2009 - 2023 by Expert-Advisor.com - Das Metatrader Forum
MetaTrader bzw. MetaTrader 4 und MetaTrader 5 sind eingetragene Marken der MetaQuotes Software Corp.
-----------------------------------------------------------------------------------------------------------------------------