|
Programmierung MQL4 Hier gehts rund ums Programmieren in MQL4. |
|
Themen-Optionen | Thema durchsuchen | Ansicht |
|
|||
Zitat:
Beim kompilieren kommen aber nur noch Wrnhinweise 'implicit conversion from string to number'. Aber das kann doch nicht der Grund sein oder doch? Code:
#property copyright "Copyright 2016, MetaQuotes Software Corp." #property link "https://www.mql5.com" #property version "1.00" #property strict //+------------------------------------------------------------------+ //| Expert initialization function | //+------------------------------------------------------------------+ extern int MA_Periode_lang = 30; extern int MA_Periode_kurz = 8; extern double HandelsLots = 0.1, SL_prozent = 0.5, TP_prozent = 1.5; extern int MagicNummer = 12345; extern int OrdersTotal; // Globale Variable datetime PeriodenStartZeit; bool NeuePeriodeBegonnen,LongSignal,ShortSignal; int LongOrder, ShortOrder; //void Sleep(int milliseconds); //int TimeWaiting = 0; int OnInit() { //--- PeriodenStartZeit = Time[0]; //--- return(INIT_SUCCEEDED); } //+------------------------------------------------------------------+ //| Expert deinitialization function | //+------------------------------------------------------------------+ void OnDeinit(const int reason) { //--- } //+------------------------------------------------------------------+ //| Expert tick function | //+------------------------------------------------------------------+ //void OnTick() // { //--- // } //+------------------------------------------------------------------+ // expert function int start () { // Überprüfen ob neuer Periodenbeginn vorliegt if(PeriodenStartZeit != Time[0]) { NeuePeriodeBegonnen = true; PeriodenStartZeit = Time[0]; } else NeuePeriodeBegonnen = false; // Marktdaten ermitteln double MA_lang = iMA(NULL,0,MA_Periode_lang,0,0,0,1); double MA_lang_Vorperiode = iMA(NULL,0,MA_Periode_lang,0,0,0,2); double MA_kurz = iMA(NULL,0,MA_Periode_kurz,0,0,0,1); double MA_kurz_Vorperiode = iMA(NULL,0,MA_Periode_kurz,0,0,0,2); if (LongSignal == false && ShortSignal == false) { // Handelssignale ermitteln if(NeuePeriodeBegonnen == true) { // Buy Signal if(MA_lang < MA_kurz && MA_lang_Vorperiode >= MA_kurz_Vorperiode) { LongSignal = true; } else LongSignal = false; // Sell Signal if(MA_lang > MA_kurz && MA_lang_Vorperiode <= MA_kurz_Vorperiode) { ShortSignal = true; } else ShortSignal =false; } else { LongSignal = false; ShortSignal = false; } } // LongSignale umsetzen if (LongSignal == true) { // eventuell Short Order schließen if (ShortOrder>0) { if (OrderSelect(ShortOrder,SELECT_BY_TICKET) == 0) { bool ShortOrderGeclosed = OrderClose(ShortOrder,HandelsLots,Ask,10,Blue); if (ShortOrderGeclosed == true) ShortOrder = 0; } } while (LongOrder <= 0) { LongOrder = OrderSend(Symbol(),OP_BUY, HandelsLots,Ask,10,0,"MAXing Long",MagicNummer,0,Green); } } if (ShortSignal == true) { // eventuell Long Order schließen if (LongOrder>0) { if (OrderSelect(LongOrder,SELECT_BY_TICKET) == true) { bool LongOrderGeclosed = OrderClose(LongOrder,HandelsLots,Bid,10,Blue); if (LongOrderGeclosed == true) LongOrder = 0; } } while (ShortOrder <= 0) { ShortOrder = OrderSend(Symbol(),OP_SELL, HandelsLots,Bid,10,0,"MAXing Short",MagicNummer,0,Red); } } /* // SL Long Deals setzen if (OrderSelect(LongOrder,SELECT_BY_TICKET) == true) { if (OrderCloseTime() == 0 && OrderStopLoss()==0) { double StopLoss = NormalizeDouble(OrderOpenPrice()/(1+(SL_prozent/100)),Digits); bool OrderAngepasst = OrderModify(OrderTicket(),OrderOpenPrice(),StopLoss,OrderTakeProfit(),0,Yellow); } } // SL Short Deals setzen if (OrderSelect(ShortOrder,SELECT_BY_TICKET) == true) { if (OrderCloseTime() == 0 && OrderStopLoss()==0) { double StopLoss = NormalizeDouble(OrderOpenPrice()*(1+(SL_prozent/100)),Digits); bool OrderAngepasst = OrderModify(OrderTicket(),OrderOpenPrice(),StopLoss,OrderTakeProfit(),0,Yellow); } } */ // TP Long Deals setzen if (OrderSelect(LongOrder,SELECT_BY_TICKET) == true) { if (OrderCloseTime() == 0 && OrderTakeProfit()==0) { double TakeProfit = NormalizeDouble(OrderOpenPrice()*(1+(TP_prozent/100)),Digits); bool OrderAngepasst = OrderModify(OrderTicket(),OrderOpenPrice(),OrderStopLoss(),TakeProfit,0,Orange); } } // TP Short Deals setzen if (OrderSelect(ShortOrder,SELECT_BY_TICKET) == true) { if (OrderCloseTime() == 0 && OrderTakeProfit()==0) { double TakeProfit = NormalizeDouble(OrderOpenPrice()/(1+(TP_prozent/100)),Digits); bool OrderAngepasst = OrderModify(OrderTicket(),OrderOpenPrice(),OrderStopLoss(),TakeProfit,0,Orange); } } // Ticketnummern nach Closing zurücksetzen if (OrderSelect(LongOrder,SELECT_BY_TICKET) == true) { if (OrderTicket()>0 && OrderCloseTime()>0) LongOrder = 0; } if (OrderSelect(ShortOrder,SELECT_BY_TICKET) == true) { if (OrderTicket()>0 && OrderCloseTime()>0) ShortOrder = 0; } return(0); } |
|
|||
Wenn nach dem Schließen durch TP/SL die Öffnungsbedingungen
immer noch gegeben sind... Poste mal Bilder zum besseren Verständnis. |
|
|||
Zitat:
hier sind noch mal meine Bedingungen im Code: if (LongSignal == false && ShortSignal == false) { // Handelssignale ermitteln if(NeuePeriodeBegonnen == true) { // Buy Signal if(MA_lang < MA_kurz && MA_lang_Vorperiode >= MA_kurz_Vorperiode) { LongSignal = true; } else LongSignal = false; // Sell Signal if(MA_lang > MA_kurz && MA_lang_Vorperiode <= MA_kurz_Vorperiode) { ShortSignal = true; } else ShortSignal =false; } else { LongSignal = false; ShortSignal = false; } |
|
|||
Mit dem TP ist das so ne Sache. Er wird nach diesem immer
wieder ne neue Order öffnen, solange entsprechende Bedingungen gegeben sind. Versuch vielleicht z.B. nen Buy ohne TP zu schließen wenn Close Bar 1 < MA_kurz. Buy öffnen wenn Close Bar 1 > MA_kurz && MA_kurz > MA_lang Umgedreht mit Sells. Dann kann er mal verschnaufen bzw. Seitwärtsphasen auslassen. Wobei ich immer noch nicht ganz kapiere, was das mit der Vorperiode soll. Kannst Du das mal mit Chart-Bildern erklären? |
|
|||
Zitat:
Mit der Vorperiode meine ich die Periode, die genau vor der anderen Vergleichsperiode kommt - deswegen ist bei Vorperiode der Shift auf 2 gesetzt und bei den anderen auf 1 (siehe unten in rot) double MA_lang = iMA(NULL,0,MA_Periode_lang,0,0,0,1); double MA_lang_Vorperiode = iMA(NULL,0,MA_Periode_lang,0,0,0,2); double MA_kurz = iMA(NULL,0,MA_Periode_kurz,0,0,0,1); double MA_kurz_Vorperiode = iMA(NULL,0,MA_Periode_kurz,0,0,0,2); Im Bild sieht man dass die sich da genau kreuzen - nach dem TP wird sofort die neue Order eröffnet (siehe 2. Bild). Das komische ist aber, dass doch dort garnicht die gesamte Bedingung erfüllt ist also Der rote Teil ist nicht erfüllt aus meiner Sicht: // Buy Signal if(MA_lang < MA_kurz && MA_lang_Vorperiode >= MA_kurz_Vorperiode) schon komisch |
|
|||
Ich habe jetzt nur kurz drübergelesen über deinen Code, aber auf den ersten Blick würde ich sagen, dass du dein LongSignal / ShortSignal zurücksetzen musst.
Du checkst die Bedingung mit if (LongSignal == false && ShortSignal == false) {....} und setzt nur dort drinnen die Signale zurück. Wenn du aber bereits LongSignal=true hast, ein Trade eröffnet wird, dieser per TP geschlossen wird, kommt sofort der nächste Trade da LongSignal=true ist. (noch immer) |
|
|||
hab auch nur über den thread geschaut, aber ich bin mir sicher dass Susanne recht hat.
Wenn immer wieder neue Order eröffnet werden, dann nur weil die EntrySignale nicht zurück gesetzt werden oder die Variable einfach falsch ist. Glaub damit hat jeder Neuling zu kämpfen, kenn das auch ganz gut. Versuchs mal so: Code:
double MA_lang = iMA(NULL,0,MA_Periode_lang,0,0,0,1); double MA_lang_Vorperiode = iMA(NULL,0,MA_Periode_lang,0,0,0,2); double MA_kurz = iMA(NULL,0,MA_Periode_kurz,0,0,0,1); double MA_kurz_Vorperiode = iMA(NULL,0,MA_Periode_kurz,0,0,0,2); if(BarCount != Bars) { if(/*Regel Kreuzung Long*/) { //OrderSend Long rein hauen } if(/* Regel Kreuzung Short*/) { //OrderSend Short rein hauen } BarCount = Bars; } Es gibt zich Tutorials zu C++. Würd dir empfehlen erst mal Basics zu lernen bevor du weiter machst, denn dann tust du dich nicht so schwer, das hält doppelt und dreifach auf.Wenn man nicht weiß wofür int, double oder string steht,dann macht das echt keinen Sinn. Bin auch kein Profi also quereinsteiger und tuh mich oft trotz einigem Wissen noch schwer. Gelernte Programmierer haben es eben leichter LG |
Lesezeichen |
Stichworte |
kreuzung, kreuzung ma, kreuzung moving average, moving average, mql4, programmierung, programmierung metatrader |
|
|