Ti stai perdendo delle opportunità di trading:
- App di trading gratuite
- Oltre 8.000 segnali per il copy trading
- Notizie economiche per esplorare i mercati finanziari
Registrazione
Accedi
Accetti la politica del sito e le condizioni d’uso
Se non hai un account, registrati
Oppure potresti avviare un contatore una volta che il trascinamento è stato rilevato, ci sono molti modi per farlo..,
(Ho solo "un modo "per ora per farlo per me - quel modo nel tuo ultimo commento)
Signor Marco mi hai salvato la giornata, grazie mille amico.
Non per ora, ma cercherò più tardi di aggiungere alcune funzioni a queste funzioni'SL e TP '. Ho solo bisogno di ricercare un sacco di cose su questo prima di iniziare a scrivere lo script per questo.
Tutto il meglio per te, amico!
Se ricordo bene - ho visto molto tempo fa un "Modificatore d'ordine" EA funzionare così: che non si aggiornava mentre trascinavo, quando "Trascinavo OFF" trascinavo la linea, dopo aver trascinato e poi i valori " Stop Loss e Take Profit " potevano cambiare solo una volta.
Così ho letto tre e più volte il tuo ultimo commento e ho anche provato a cambiare un po' di più che potevo fermare gli aggiornamenti mentre trascinavo.
D: Quindi non è possibile, per favore?
Grazie in anticipo.
Bene, finché il flag booleano drag == 1 si potrebbe usare questo stesso flag per disabilitare gli aggiornamenti.
Come ho detto si può anche avviare un contatore, ecco un esempio di questo:
//| Drag Hline2.mq4 |
//| Copyright 2017, Marco vd Heijden, MetaQuotes Software Corp. |
//| https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2017, Marco vd Heijden, MetaQuotes Software Corp."
#property link "https://www.mql5.com"
#property version "1.00"
#property strict
double price;
bool drag;
int cnt=0;
//+------------------------------------------------------------------+
//| Expert initialization function |
//+------------------------------------------------------------------+
int OnInit()
{
//--- create timer
EventSetTimer(1);
ObjectCreate(0,"line",OBJ_HLINE,0,0,Ask);
price=ObjectGetDouble(0,"line",OBJPROP_PRICE,0);
//---
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Expert deinitialization function |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
//--- destroy timer
EventKillTimer();
}
//+------------------------------------------------------------------+
//| Expert tick function |
//+------------------------------------------------------------------+
void OnTick()
{
//---
}
//+------------------------------------------------------------------+
//| Timer function |
//+------------------------------------------------------------------+
void OnTimer()
{
//---
if(price!=ObjectGetDouble(0,"line",OBJPROP_PRICE,0))
{
drag=1;
}
if(drag==1)
{
cnt++; // increase counter
{
if(cnt>=2)// if counter == 2 seconds
{
price=ObjectGetDouble(0,"line",OBJPROP_PRICE,0); // store new value
Print(" New price: ",DoubleToString(price));
PlaySound("ok.wav");
cnt=0; // reset counter
drag=0; // reset drag
}
}
}
}
//+------------------------------------------------------------------+
O semplicemente usare un ciclo while questo funziona molto bene:
//| Timer function |
//+------------------------------------------------------------------+
void OnTimer()
{
//---
while(price!=ObjectGetDouble(0,"line",OBJPROP_PRICE,0))
{
PlaySound("ok.wav");
price=ObjectGetDouble(0,"line",OBJPROP_PRICE,0);
Comment(price);
}
}
//+------------------------------------------------------------------+
Bene, finché il flag booleano drag == 1 potresti usare questo stesso flag per disabilitare gli aggiornamenti.
Come ho detto, puoi anche avviare un contatore, ecco un esempio di questo:
O semplicemente usare un ciclo while questo funziona molto bene:
Dice solo mentre (sto trascinando) aggiorna il prezzo finché non diventano entrambi uguali (quando smetto di trascinare)
( e i vostri codici )
Che esempi brillanti amico! Questo è davvero un commento molto molto utile, grazie mille. E ora sto cercando di aggiungere altre cose per quelle linee (disegni e funzioni ).
( Per favore, non biasimatemi per questa mia domanda: Ho " graphics() " che sto usando per gli oggetti grafici, e lo sto chiamando attraverso Init() e ho bisogno di chiamarlo attraverso OnTimer(), quindi la mia domanda è: sto facendo male, per favore? )
Tutto il meglio per te!
Potete incorrere nell'errore 4200 che è failed to create object perché esiste già.
Quindi dovete vedere se l'oggetto esiste prima di provare a (ri)crearlo o modificarlo.
Potete usare:
{
//Object does not exist
}
and/or
if(ObjectFind(0,"Long")>=0)
{
// Object already exists
}
Si può usare:
Hmm, questa è davvero una nuova funzione per me.
Potrei provare dopo aver fatto delle ricerche in merito. (L'ho visto un sacco di volte ma non l'ho mai usato per me).
Grazie mille.
#Convertire il prezzo in pixel - Aperto
Uso "HLine" per la funzione Take Profit.
Ho alcuni oggetti (Label, RecLabel... e così via) e vorrei che questi oggetti potessero muoversi con l'oggetto "HLine". Così ho trovato la seguente funzione. Ma non vorrei convertire " X ". Voglio convertire solo Price in Y.
Non ho mai provato nulla con il codice sottostante.
D: Perché voglio essere sicuro che possa aiutarmi per questa mia preoccupazione?
(se so che potrebbe aiutarmi allora inizierò a provarlo per il mio problema).
D: E c'è qualche metodo per alcuni oggetti che possono muoversi con "HLine"?
datetime time = 0; // I just want to ignore this because I just want to give to X = 20; fixed mode ( should not change ever )
double price = ObjectGetDouble( 0, "line", OBJPROP_PRICE, 0 );
int x,y;
ChartTimePriceToXY( long chart_id, int sub_window, datetime time, double price, int& x, int& y );
Grazie in anticipo.
Dovrete essere un po' più specifici, potete fare molte cose in molti modi.
Queste funzioni sono utilizzate nella funzione OnChartEvent().
ChartPriceToXY - ti darà la conversione del tempo del prezzo in coordinate, è veramente ciò di cui hai bisogno?
Forse intendi ChartXYToTimePrice()?
https://www.mql5.com/en/docs/chart_operations/chartxytotimeprice
Se non hai bisogno del valore, puoi semplicemente passarlo come zero, vedi l'esempio qui sotto.
//| CrossHair.mq4 |
//| Copyright 2017, Marco vd Heijden, MetaQuotes Software Corp. |
//| https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2017, Marco vd Heijden, MetaQuotes Software Corp."
#property link "https://www.mql5.com"
#property version "1.00"
#property strict
//+------------------------------------------------------------------+
//| Expert initialization function |
//+------------------------------------------------------------------+
int OnInit()
{
//--- create some lines
ObjectCreate(0,"X",OBJ_HLINE,0,0,Ask); // X = Horizontal Axis (time==0)
ObjectCreate(0,"Y",OBJ_VLINE,0,TimeCurrent(),0);// Y = Vertical Axis (price==0)
//---
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Expert deinitialization function |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
//--- clean up
ObjectsDeleteAll(0,0,EMPTY);
}
//+------------------------------------------------------------------+
//| Expert tick function |
//+------------------------------------------------------------------+
void OnTick()
{
//---
}
//+------------------------------------------------------------------+
//| ChartEvent function |
//+------------------------------------------------------------------+
void OnChartEvent(const int id,
const long &lparam,
const double &dparam,
const string &sparam)
{
//--- If this is an event of a mouse click on the chart
if(id==CHARTEVENT_CLICK)
{
//--- Prepare variables
int x =(int)lparam;
int y =(int)dparam;
datetime time =0;
double price =0;
int window=0;
//--- Convert the X and Y coordinates in terms of date/time
if(ChartXYToTimePrice(0,x,y,window,time,price))
{
ObjectMove(0,"X",0,0,price); // notice time==0 because horizontal axis
ObjectMove(0,"Y",0,time,0); // notice price==0 because vertical axis
}
else
Print("ChartXYToTimePrice return error code: ",GetLastError());
Print("+--------------------------------------------------------------+");
}
}
//+------------------------------------------------------------------+
Ho già letto quella documentazione ma non l'ho capito chiaramente fino al tuo ultimo commento. In realtà non ho ancora provato, perché ho lottato sotto il codice, ho già provato alcuni modi per ottenere buoni risultati, ma non ci riesco.
Signor Marco, grazie per il suo ultimo grande commento, che sento di poter utilizzare per il mio problema di spostamento degli oggetti.
Ho davvero speso molto tempo per trovare una soluzione al mio problema, ma non riesco a ottenere buoni risultati.
Ma comunque posso ottenere (attualmente aprendo posizioni) i prezzi di Take Profit, cioè voglio che gli oggetti "hline" possano chiamare i prezzi di Take Profit a se stessi, e funziona. E funziona solo le volte iniziali. Sì, lo so perché è in " Init() ". Ma ho provato a metterlo in " OnTimer() " ma non funziona correttamente.
Per favore fatemi sapere qualcosa che mi aiuti a capire cosa potrei imparare e fare per il mio problema.
Ricomincerò la ricerca su questo problema dopo 7 ore.
Se ottengo un buon commento sarà meglio per me.
for ( i = OrdersTotal() - 1; i >= 0; i-- )
{
if ( ! OrderSelect( i, SELECT_BY_POS, MODE_TRADES ) ) continue;
if ( OrderSymbol() == Symbol() ) tpprice = OrderTakeProfit();
ObjectCreate (
"#" + IntegerToString( OrderTicket() ) + " -" + "tphline", // name
OBJ_HLINE,
0, // subwindow
0, // time
tpprice // price1
);
tpprice =
ObjectGetDouble (
0,
"#" + IntegerToString( OrderTicket() ) + " -" + "tphline", // name
OBJPROP_PRICE, 0
);
}
// ontimer() --------------------------------------------------------
if ( tpprice != ObjectGetDouble( 0, "#" + IntegerToString( OrderTicket() ) + " -" + "tphline", OBJPROP_PRICE, 0 ) )
{
tpdrag = 1;
}
if ( tpdrag == 1 )
{
tpprice = ObjectGetDouble( 0, "#" + IntegerToString( OrderTicket() ) + " -" + "tphline", OBJPROP_PRICE, 0 );
Print( "tpdrag: ", tpdrag, " - Price: ", DoubleToString( tpprice, Digits ) );
// actually here is a graphical objects functin()
// here one of them
// also which one soon I will try to below objects could moves together " tphline " - but I can't take a time to research about your latest comment and so...
ObjectCreate( "recl object", OBJ_RECTANGLE, 0, 0, tpprice ); // I feel I could add something to " string name " - I already tried few things not good results
tpdrag = 0;
}
//---
return;
Grazie in anticipo.
Tutto il meglio per voi!
Usa lo styler, è sotto la scheda Strumenti.
Non ho idea di cosa tu stia cercando di realizzare, quindi devo indovinare cosa vuoi fare, il che non è mai un bene.
Ma puoi guardare l'esempio qui:
//| Stealth 4.mq4 |
//| Copyright 2017, Marco vd Heijden, MetaQuotes Software Corp. |
//| https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2017, Marco vd Heijden, MetaQuotes Software Corp."
#property link "https://www.mql5.com"
#property version "1.00"
#property strict
static input int takeprofit=500;// Take Profit
static input int stoploss=500; // Stop Loss
//+------------------------------------------------------------------+
//| Expert initialization function |
//+------------------------------------------------------------------+
int OnInit()
{
//--- create timer
EventSetTimer(1);
//---
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Expert deinitialization function |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
//--- destroy timer
EventKillTimer();
}
//+------------------------------------------------------------------+
//| Expert tick function |
//+------------------------------------------------------------------+
void OnTick()
{
//---
}
//+------------------------------------------------------------------+
//| Timer function |
//+------------------------------------------------------------------+
void OnTimer()
{
for(int order=OrdersTotal(); order>=0; order--)
{
bool selected=OrderSelect(order,SELECT_BY_POS);
{
if(selected==1)
{
if(Symbol()==OrderSymbol()) // only for current chart symbol
{
switch(OrderType())
{
case OP_BUY: // for buy order
{
// if objects not found - create them
if(ObjectFind(0,"#"+IntegerToString(OrderTicket())+"-TP")<0)
{
ObjectCreate(0,"#"+IntegerToString(OrderTicket())+"-TP",OBJ_HLINE,0,0,OrderOpenPrice()+takeprofit*Point());
ObjectSet("#"+IntegerToString(OrderTicket())+"-TP",7,3);
}
if(ObjectFind(0,"#"+IntegerToString(OrderTicket())+"-SL")<0)
{
ObjectCreate(0,"#"+IntegerToString(OrderTicket())+"-SL",OBJ_HLINE,0,0,OrderOpenPrice()-stoploss*Point());
ObjectSet("#"+IntegerToString(OrderTicket())+"-SL",7,3);
}
// if objects exist
if(ObjectFind(0,"#"+IntegerToString(OrderTicket())+"-TP")>=0)
{
if(Bid>ObjectGetDouble(0,"#"+IntegerToString(OrderTicket())+"-TP",OBJPROP_PRICE,0))
{
bool close=OrderClose(OrderTicket(),OrderLots(),OrderClosePrice(),3,clrBlue);
{
if(close==0)
{
Alert(" Order Close Error! # "+IntegerToString(OrderTicket()));
}
if(close==1)
{
Alert(" Order: "+IntegerToString(OrderTicket())+" Closed due to TP Profit = "+DoubleToString(OrderProfit(),2));
ObjectDelete(0,"#"+IntegerToString(OrderTicket())+"-TP");
ObjectDelete(0,"#"+IntegerToString(OrderTicket())+"-SL");
}
}
}
}
if(ObjectFind(0,"#"+IntegerToString(OrderTicket())+"-SL")>=0)
{
if(Ask<ObjectGetDouble(0,"#"+IntegerToString(OrderTicket())+"-SL",OBJPROP_PRICE,0))
{
bool close=OrderClose(OrderTicket(),OrderLots(),OrderClosePrice(),3,clrBlue);
{
if(close==0)
{
Alert(" Order Close Error! # "+IntegerToString(OrderTicket()));
}
if(close==1)
{
Alert(" Order: "+IntegerToString(OrderTicket())+" Closed due to SL Profit = "+DoubleToString(OrderProfit(),2));
ObjectDelete(0,"#"+IntegerToString(OrderTicket())+"-TP");
ObjectDelete(0,"#"+IntegerToString(OrderTicket())+"-SL");
}
}
}
}
}
break;
case OP_SELL: // for sell order
{
// if objects not found - create them
if(ObjectFind(0,"#"+IntegerToString(OrderTicket())+"-TP")<0)
{
ObjectCreate(0,"#"+IntegerToString(OrderTicket())+"-TP",OBJ_HLINE,0,0,OrderOpenPrice()-takeprofit*Point());
ObjectSet("#"+IntegerToString(OrderTicket())+"-TP",7,3);
}
if(ObjectFind(0,"#"+IntegerToString(OrderTicket())+"-SL")<0)
{
ObjectCreate(0,"#"+IntegerToString(OrderTicket())+"-SL",OBJ_HLINE,0,0,OrderOpenPrice()+stoploss*Point());
ObjectSet("#"+IntegerToString(OrderTicket())+"-SL",7,3);
}
// if objects exist
if(ObjectFind(0,"#"+IntegerToString(OrderTicket())+"-TP")>=0)
{
if(Ask<ObjectGetDouble(0,"#"+IntegerToString(OrderTicket())+"-TP",OBJPROP_PRICE,0))
{
bool close=OrderClose(OrderTicket(),OrderLots(),OrderClosePrice(),3,clrBlue);
{
if(close==0)
{
Alert(" Order Close Error! # "+IntegerToString(OrderTicket()));
}
if(close==1)
{
Alert(" Order: "+IntegerToString(OrderTicket())+" Closed due to TP Profit = "+DoubleToString(OrderProfit(),2));
ObjectDelete(0,"#"+IntegerToString(OrderTicket())+"-TP");
ObjectDelete(0,"#"+IntegerToString(OrderTicket())+"-SL");
}
}
}
}
if(ObjectFind(0,"#"+IntegerToString(OrderTicket())+"-SL")>=0)
{
if(Bid>ObjectGetDouble(0,"#"+IntegerToString(OrderTicket())+"-SL",OBJPROP_PRICE,0))
{
bool close=OrderClose(OrderTicket(),OrderLots(),OrderClosePrice(),3,clrBlue);
{
if(close==0)
{
Alert(" Order Close Error! # "+IntegerToString(OrderTicket()));
}
if(close==1)
{
Alert(" Order: "+IntegerToString(OrderTicket())+" Closed due to SL Profit = "+DoubleToString(OrderProfit(),2));
ObjectDelete(0,"#"+IntegerToString(OrderTicket())+"-TP");
ObjectDelete(0,"#"+IntegerToString(OrderTicket())+"-SL");
}
}
}
}
}
break;
}
}
}
}
}
}
//+------------------------------------------------------------------+
Così puoi vedere che puoi usare ObjectGetDouble direttamente, non c'è bisogno di copiare il valore in un altro doppio perché l'oggetto stesso tiene il valore, e quando trascini la linea quel valore cambia automaticamente, e sarà visto la prossima volta che lo leggi.