Ich danke Ihnen! Ich wusste nicht, dass MQL eine Funktion für so etwas hat. Ich war im Begriff, meine eigene zu schaffen. Aber vorher habe ich beschlossen, im Forumzu fragen.
Dies ist eine Folge des falschen Ansatzes beim Sprachenlernen. Hätten Sie mit der Dokumentation gearbeitet und nicht mit dem g.code von......... die Ressourcenhilfe gelesen, hätten Sie davon erfahren. Und Sie brauchen nicht zu fragen.
Ich habe dies so gemacht, dass beim Trailing eines Kontrakts der Take Profitgleich 500 und der Stop Loss gleich 150 ist.
Es werden bis zu fünf zusätzliche Verträge gekauft.
Kann ich die Eröffnung neuer Positionen verbieten, wenn bereits zwei offen sind? Begrenzen Sie das Volumen der offenen Positionen.
//--------------------------------------------------------------------void OPENORDER(string ord)
{
double priceL=m_symbol.Ask();
if(ord=="Sell")
//--- check for free moneyif(m_account.FreeMarginCheck(Symbol(),ORDER_TYPE_BUY,my_lot,priceL)<0.0)
printf("We have no money. Free Margin = %f",m_account.FreeMargin());
elseif(!m_trade.Sell(my_lot,Symbol(),m_symbol.Bid(),my_SL,my_TP,""))
Print("BUY_STOP -> false. Result Retcode: ",m_trade.ResultRetcode(),
", description of Retcode: ",m_trade.ResultRetcodeDescription(),
", ticket of order: ",m_trade.ResultOrder()); // Если sell, то не открываемсяdouble priceS=m_symbol.Bid();
if(ord=="Buy")
//--- check for free moneyif(m_account.FreeMarginCheck(Symbol(),ORDER_TYPE_SELL,my_lot,priceS)<0.0)
printf("We have no money. Free Margin = %f",m_account.FreeMargin());
elseif(!m_trade.Buy(my_lot,Symbol(),m_symbol.Ask(),my_SL,my_TP,""))
Print("Buy -> false. Result Retcode: ",m_trade.ResultRetcode(),
", description of result: ",m_trade.ResultRetcodeDescription(),
", ticket of deal: ",m_trade.ResultDeal());
return;
}
double iMAGet(constint handle,constint index)
{
double MA[];
ArraySetAsSeries(MA,true);
//--- reset error codeResetLastError();
//--- fill a part of the iMABuffer array with values from the indicator buffer that has 0 indexif(CopyBuffer(handle,0,0,index+1,MA)<0)
{
//--- if the copying fails, tell the error codePrintFormat("Failed to copy data from the iMA indicator, error code %d",GetLastError());
//--- quit with zero result - it means that the indicator is considered as not calculatedreturn(0.0);
}
return(MA[index]);
}
//+------------------------------------------------------------------+//| Refreshes the symbol quotes data |//+------------------------------------------------------------------+bool RefreshRates()
{
//--- refresh ratesif(!m_symbol.RefreshRates())
return(false);
//--- protection against the return value of "zero"if(m_symbol.Ask()==0 || m_symbol.Bid()==0)
return(false);
//---return(true);
}
//+------------------------------------------------------------------+//| Get Time for specified bar index |//+------------------------------------------------------------------+datetimeiTime(constint index,string symbol=NULL,ENUM_TIMEFRAMES timeframe=PERIOD_CURRENT)
{
if(symbol==NULL)
symbol=Symbol();
if(timeframe==0)
timeframe=Period();
datetime Time[];
datetime time=0;
ArraySetAsSeries(Time,true);
int copied=CopyTime(symbol,timeframe,index,1,Time);
if(copied>0)
time=Time[0];
return(time);
}
//+------------------------------------------------------------------+//| Get value of buffers |//+------------------------------------------------------------------+bool iGetArray(constint handle,constint buffer,constint start_pos,
constint count,double &arr_buffer[])
{
bool result=true;
if(!ArrayIsDynamic(arr_buffer))
{
PrintFormat("ERROR! EA: %s, FUNCTION: %s, this a no dynamic array!",__FILE__,__FUNCTION__);
return(false);
}
ArrayFree(arr_buffer);
//--- reset error codeResetLastError();
//--- fill a part of the iBands array with values from the indicator bufferint copied=CopyBuffer(handle,buffer,start_pos,count,arr_buffer);
if(copied!=count)
{
//--- if the copying fails, tell the error codePrintFormat("ERROR! EA: %s, FUNCTION: %s, amount to copy: %d, copied: %d, error code %d",
__FILE__,__FUNCTION__,count,copied,GetLastError());
//--- quit with zero result - it means that the indicator is considered as not calculatedreturn(false);
}
return(result);
}
void TrailingOrder()
{
if(InpTrailingOrderLimit==0)
return;
for(int i=PositionsTotal()-1;i>=0;i--) // returns the number of open positionsif(m_position.SelectByIndex(i))
if(m_position.Symbol()==m_symbol.Name() && m_position.Magic()==m_magic)
{
if(m_position.PositionType()==POSITION_TYPE_BUY)
{
if(m_position.PriceCurrent()-m_position.PriceOpen()>ExtTrailingOrderLimit+ExtTrailingOrderStep)
if(m_position.StopLoss()<m_position.PriceCurrent()-(ExtTrailingOrderLimit+ExtTrailingOrderStep))
{
if(!m_trade.PositionModify(m_position.Ticket(),
m_symbol.NormalizePrice(m_position.PriceCurrent()-ExtTrailingOrderLimit),
m_position.TakeProfit()))
Print("Modify ",m_position.Ticket());
OPENORDER("Buy");
}
}
else
{
if(m_position.PriceOpen()-m_position.PriceCurrent()>ExtTrailingOrderLimit+ExtTrailingOrderStep)
if((m_position.StopLoss()>(m_position.PriceCurrent()+(ExtTrailingOrderLimit+ExtTrailingOrderStep))) ||
(m_position.StopLoss()==0))
{
if(!m_trade.PositionModify(m_position.Ticket(),
m_symbol.NormalizePrice(m_position.PriceCurrent()+ExtTrailingOrderLimit),
m_position.TakeProfit()))
Print("Modify ",m_position.Ticket());
OPENORDER("Sell");
}
}
}
}
void Trailing()
{
if(InpTStop==0)
return;
if(m_position.Symbol()==m_symbol.Name() && m_position.Magic()==m_magic)
{
if(m_position.PositionType()==POSITION_TYPE_BUY)
{
if(m_position.PriceCurrent()-m_position.PriceOpen()>ExtTStop+ExtTStep)
if(m_position.StopLoss()<m_position.PriceCurrent()-(ExtTStop+ExtTStep))
{
if(!m_trade.PositionModify(m_position.Ticket(),
m_symbol.NormalizePrice(m_position.PriceCurrent()-ExtTStepShift),
m_position.TakeProfit()))
Print("Modify ",m_position.Ticket(),
" Position -> false. Result Retcode: ",m_trade.ResultRetcode(),
", description of result: ",m_trade.ResultRetcodeDescription());
}
}
else
{
if(m_position.PriceOpen()-m_position.PriceCurrent()>ExtTStop+ExtTStep)
if((m_position.StopLoss()>(m_position.PriceCurrent()+(ExtTStop+ExtTStep))) ||
(m_position.StopLoss()==0))
{
if(!m_trade.PositionModify(m_position.Ticket(),
m_symbol.NormalizePrice(m_position.PriceCurrent()+ExtTStepShift),
m_position.TakeProfit()))
Print("Modify ",m_position.Ticket(),
" Position -> false. Result Retcode: ",m_trade.ResultRetcode(),
", description of result: ",m_trade.ResultRetcodeDescription());
}
}
}
}
Alexey Viktorov: Dies ist eine Folge der falschen Herangehensweise an das Studium der Sprache. Wenn Sie mit der Dokumentation arbeiten würden, anstatt mit der Codierung von ........., würden Sie die Hilfe zu den Ressourcen lesen. Und Sie brauchen nicht zu fragen.
Ich wusste, dass auf meine Antwort ein Vortrag folgen würde... Du weißt schon, so wie du es tust... Ich dachte, ich hätte das gesagt: "Danke", aber nein... Sie müssen etwas schreiben... Wenn Sie die Funktion aus der Dokumentation kennen, ist das gut für Sie! Aber wenn Sie den Code nicht richtig kennen, können Sie die MQL-Dokumentation weit und breit studieren, aber es wird Ihnen in der Praxis sehr wenig nützen...!
Hallo.
Können Sie mir sagen, ob es möglich ist, eine Spalte mit Kommentaren oder Erklärungen in den EA-Parametern hinzuzufügen... ???
Ich danke Ihnen.
Ja, aber Sie brauchen die Quelle.
Ich danke Ihnen! Ich wusste nicht, dass MQL eine Funktion für so etwas hat. Ich war im Begriff, meine eigene zu schaffen. Aber vorher habe ich beschlossen, im Forumzu fragen.
Hallo.
Können Sie mir sagen, ob es möglich ist, eine Spalte mit Kommentaren oder Erklärungen in den EA-Parametern hinzuzufügen... ???
Ich danke Ihnen.
Wann werden Sie lernen, die Dokumentation zu lesen?
Dies ist eine Folge der falschen Herangehensweise an das Studium der Sprache. Wenn Sie mit der Dokumentation arbeiten würden, anstatt mit der Codierung von ........., würden Sie die Hilfe zu den Ressourcen lesen. Und Sie brauchen nicht zu fragen.
Ich wusste, dass auf meine Antwort ein Vortrag folgen würde... Du weißt schon, so wie du es tust... Ich dachte, ich hätte das gesagt: "Danke", aber nein... Sie müssen etwas schreiben... Wenn Sie die Funktion aus der Dokumentation kennen, ist das gut für Sie! Aber wenn Sie den Code nicht richtig kennen, können Sie die MQL-Dokumentation weit und breit studieren, aber es wird Ihnen in der Praxis sehr wenig nützen...!
Ich bin zufällig auf diesen Fehler gestoßen
Zwei identische Schaltflächen mit leicht unterschiedlichen Koordinaten erstellen
sieht es so aus
Das Ergebnis ist jedoch, dass nur die erste Schaltfläche auf OnChartEvent reagiert, die zweite jedoch nicht.
Ich habe es so eingerichtet, dass beim Trailing eines Kontrakts der Take Profitgleich 500 und der Stop Loss gleich 150 ist.
Ich kenne MQL5 nicht, aber ich denke
Ich bin zufällig auf diesen Fehler gestoßen
Erstellen Sie zwei identische Schaltflächen mit leicht unterschiedlichen Koordinaten
sieht es so aus
aber infolgedessen reagiert nur die erste Schaltfläche auf OnChartEvent, die zweite jedoch nicht.
Können Sie den Code im Handler sehen?
Und warum steht bei den Parametern -73, das ist nicht ganz klar...?
Kann ich den Code im Handler sehen?
Und warum steht in den Parametern -73, nicht ganz klar...?
Er gibt keine Fehler aus.
Mit diesen Koordinaten steht der Knopf auf dem Kopf, da die Länge des Knopfes vom Punkt X aus berechnet wird