[ARCHIVIO] Qualsiasi domanda da principiante, per non ingombrare il forum. Professionisti, non passate oltre. Da nessuna parte senza di te - 3. - pagina 253
![MQL5 - Linguaggio delle strategie di trading integrato nel client terminal MetaTrader 5](https://c.mql5.com/i/registerlandings/logo-2.png)
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
Spostato:
qaz2005 11.10.2011 09:30
Buon pomeriggio a tutti! Per favore consigliatemi, c'è un indicatore personalizzato, ha due oggetti. I loro valori posso scoprirli, ma qui non c'è modo di distinguerli, che sia la linea superiore o inferiore. Non posso sapere il numero e l'ordine dei buffer, quando si installa non ci sono impostazioni. Su Internet ho letto che le impostazioni per il colore vanno anche come buffer, come fare riferimento a loro attraverso la funzione iCustom () o forse qualsiasi altra funzione per risolvere questo punto?
Grazie in anticipo!
P.S. Esiste una letteratura sul linguaggio MQL4? Ho già scaricato e quasi finito un tutorial su MQL4.
I numeri dei buffer sono contati a partire da "0",
iCustom(NULL, 0, "ind",150, 0,2);
dove 150 è il periodo,
0 è il buffer,
2 è una barra.
https://docs.mql4.com/ru/indicators/iCustom
ad esempio
#property indicator_buffers 2
#property indicator_color1 Blue
#property indicator_color2 Red
quindi molto probabilmente blu = 0 buffer
e rosso = 1
Alexander, grazie per aver condiviso la tua esperienza! Ma lungo la strada ho una domanda: come si fa l'enumerazione delle valute? O è il nome della valuta nel f-i di OrderSend() al posto di Symbol()? E potresti spiegare come inserire il tuo esempio nel codice? Grazie ancora per il vostro aiuto! :)
Roman, in pratica ha spiegato.
Ovunque dove Symbol() è specificato in Expert Advisor, metti per esempio: SymbolMax[nnnn]. In OrderSend(), appare cosìtick=OrderSend(SymbolMax[nnnn],OP_BUYSTOP,L,ur,0,sl,tp,CMM,MAGIC[I],0,Red);
L'ho scritto nel mio Expert Advisor, e lì si impostano i propri valori. È possibile impostare l'elenco delle valute, per esempio:
stringa SymbolMax[4] = {"EURUSD", "GBPUSD", "USDCHF", "USDJPY"};
Forse, qualcuno l'ha implementato in un altro modo, ma questo è il mio lookup di valuta - vedi il codice qui sotto. Ho messo inizio all'inizio della funzione. Inoltre ho fatto un ritardo di 5 secondi per evitare che i messaggi saltino.
Ho un problema con una modifica in loop,
la modifica è rappresentata come una funzione definita dall'utente
La cosa più interessante è che la funzione standard trawl funziona con entrambe queste funzioni e posso farlo da solo ok, ma quando uso una modifica frattale con breakeven, ottengo modifiche infinite con fractal e breakeven
Mi sono basato sulla modifica di https://book.mql4.com/ru/trading/ordermodify
Ho l'impressione che il criterio per modificare il Breakeven non sia impostato correttamente, come posso sistemarlo per evitare il looping?
//ф-я модификации ордеров безубыток
int mod_b()
{
//--------------------------------------------------------------- 2 --
for(int i=1; i<=OrdersTotal(); i++) // Цикл перебора ордер
{
if (OrderSelect(i-1,SELECT_BY_POS)==true) // Если есть следующий
{ // Анализ ордеров:
int Tip=OrderType(); // Тип ордера
if(OrderSymbol()!=Symb||Tip>1)continue;// Не наш ордер
double SL=OrderStopLoss(); // SL выбранного орд.
double TP =OrderTakeProfit(); // TP выбранного орд.
double Price =OrderOpenPrice(); // Цена выбранн. орд.
int Ticket=OrderTicket(); // Номер выбранн. орд.
//------------------------------------------------------ 3 --
while(true) // Цикл модификации
{
double TS=Tral_Stop; // Исходное значение
int Min_Dist=MarketInfo(Symb,MODE_STOPLEVEL);//Миним. дист&&((SL<TS && Tip==0)||(SL>TS && Tip==1))
if (TS < Min_Dist) // Если меньше допуст.
TS=Min_Dist; // Новое значение TS
//--------------------------------------------------- 4 --
bool Modify=false; // Не назначен к модифи
switch(Tip) // По типу ордера
{
case 0 : // Ордер Buy
if (NormalizeDouble(SL,Digits)< // Если ниже желаем.
NormalizeDouble(Bid-TS*Point,Digits))
{
SL=Price+18*Point; // то модифицируем его
string Text="Buy "; // Текст для Buy
Modify=true; // Назначен к модифи.
}
break; // Выход из switch
case 1 : // Ордер Sell
if (NormalizeDouble(SL,Digits)> // Если выше желаем.
NormalizeDouble(Ask+TS*Point,Digits)
|| NormalizeDouble(SL,Digits)==0)//или равно нулю
{
SL=Price-18*Point; // то модифицируем его
Text="Sell "; // Текст для Sell
Modify=true; // Назначен к модифи.
}
} // Конец switch
if (Modify==false) // Если его не модифи
break; // Выход из while
//--------------------------------------------------- 5 --
Alert ("Модификация ",Text,Ticket,". Ждём ответ..");
bool Ans=OrderModify(Ticket,Price,SL,TP,0);//Модифи его!
//--------------------------------------------------- 6 --
if (Ans==true) // Получилось :)
{
Alert ("Ордер ",Text,Ticket," модифицирован:)");
break; // Из цикла модифи.
}
{
//--------------------------------------------------------------- 2 --
for(int i=1; i<=OrdersTotal(); i++) // Цикл перебора ордер
{
if (OrderSelect(i-1,SELECT_BY_POS)==true) // Если есть следующий
{ // Анализ ордеров:
int Tip=OrderType(); // Тип ордера
if(OrderSymbol()!=Symb||Tip>1)continue;// Не наш ордер
double SL=OrderStopLoss(); // SL выбранного орд.
//------------------------------------------------------обсчет фрактала
int f = 3; //номер бара с которого идет проверка наличия фрагтала
int DnN = 0, UpN = 0; //порядковый номер присвоен к направлению(upper, lower)
double UpFr = 0, DnFr = 0; //числовое значение фрагтала выраженное в еденице валюты присвоен к направлению(upper, lower)
while (f < Bars && (UpFr == 0 || DnFr == 0))
{
if (iFractals(Symbol(), 0, MODE_UPPER, f) != 0)
if (UpFr == 0)
{
UpFr = iFractals(Symbol(), 0, MODE_UPPER, f);//фрактальная отложка вверх(buy)
UpN = f;
}
if (iFractals(Symbol(), 0, MODE_LOWER, f) != 0)
if (DnFr == 0)
{
DnFr = iFractals(Symbol(), 0, MODE_LOWER, f);//фрактальная отложка вниз(sell)
DnN = f;
}
f++;
}
//------------------------------------------------------ 3 --
while(true) // Цикл модификации
{
double UD;
double TS=UD; // Исходное значение
int Min_Dist=MarketInfo(Symb,MODE_STOPLEVEL);//Миним. дист
if(Tip==0)
UD=DnFr;
if(Tip==1)
UD=UpFr;
if (TS < Min_Dist) // Если меньше допуст.
TS=Min_Dist; // Новое значение TS
//--------------------------------------------------- 4 --
bool Modify=false; // Не назначен к модифи
switch(Tip) // По типу ордера
{
case 0 : // Ордер Buy
if (NormalizeDouble(SL,Digits)< // Если ниже желаем.
NormalizeDouble(UD,Digits))
{
SL=UD; // то модифицируем его
string Text="Buy "; // Текст для Buy
Modify=true; // Назначен к модифи.
}
break; // Выход из switch
case 1 : // Ордер Sell
if (NormalizeDouble(SL,Digits)> // Если выше желаем.
NormalizeDouble(UD,Digits)
|| NormalizeDouble(SL,Digits)==0)//или равно нулю
{
SL=UD; // то модифицируем его
Text="Sell "; // Текст для Sell
Modify=true; // Назначен к модифи.
}
} // Конец switch
if (Modify==false) // Если его не модифи
break; // Выход из while
//--------------------------------------------------- 5 --
double TP =OrderTakeProfit(); // TP выбранного орд.
double Price =OrderOpenPrice(); // Цена выбранн. орд.
int Ticket=OrderTicket(); // Номер выбранн. орд.
Alert ("Модификация ",Text,Ticket,". Ждём ответ..");
bool Ans=OrderModify(Ticket,Price,SL,TP,0);//Модифи его!
//--------------------------------------------------- 6 --
if (Ans==true) // Получилось :)
{
Alert ("Ордер ",Text,Ticket," модифицирован:)");
break; // Из цикла модифи.
}
Ciao Cari utenti del forum.
Come posso richiedere preventivi di altri tempi? Ho un modello su D e il mio indicatore ha bisogno di quotazioni LOW, HIGH, OPEN, CLOSE da timeframes più piccoli (M30, H1, H4 per esempio).
Ciao Cari utenti del forum.
Come posso richiedere preventivi di altri tempi? Ho un modello su D e il mio indicatore ha bisogno di quotazioni LOW, HIGH, OPEN, CLOSE da timeframes più piccoli (M30, H1, H4 per esempio).
Buona sera a tutti. ditemi qual è l'errore qui. ecco un pezzo di codice.
//+------------------------------------------------------------------+
//| Funzione di avvio |
//+------------------------------------------------------------------+
void start()
{
//---- controllare lo storico e il trading
if(Bars<100 || IsTradeAllowed()==false) return;
//---- calcolare gli ordini aperti per simbolo corrente
if(CalculateCurrentOrders(Symbol())==0) CheckForOpen();
else CheckForClose();
if (!IfTrueThenCountBarWork) return (0);
for (int i = OrdersTotal() - 1; i >= 0; i--)
{
OrderSelect(i, SELECT_BY_POS, MODE_TRADES)
if (OrderMagicNumber() == 700000) <---- IN QUESTA LINEA È ERRORE!!!
CloseAfterSomeBar (CountBar, OrderTicket());
}
}
Buona sera a tutti. per favore consigliatemi qual è l'errore qui. ecco un pezzo di codice.
//+------------------------------------------------------------------+
//| Iniziare la funzione |
//+------------------------------------------------------------------+
void start()
{
//---- controllare la storia e il commercio
if(Bars<100 || IsTradeAllowed()==false) return;
//---- calcolare gli ordini aperti in base al simbolo corrente
if(CalculateCurrentOrders(Symbol())==0) CheckForOpen();
else CheckForClose();
if (!IfTrueThenCountBarWork) return (0);
per (int i = OrdiniTotali() - 1; i >= 0; i--)
{
OrderSelect(i, SELECT_BY_POS, MODE_TRADES)
if (OrderMagicNumber() == 700000) <---- IN QUESTA CORSA PARLA DI ERRORE!!!
CloseAfterSomeBar (CountBar, OrderTicket())
}
}
PapaYozh:
Пропущен символ ";"
grazie!!! Non l'ho notato all'inizio.)))
Un'altra domanda agli esperti. come inserire correttamente la condizione di apertura: Close[2]<Close[3] di n per cento per vendere. per comprare il contrario naturalmente. e n può essere ottimizzato? grazie in anticipo!
void CheckForOpen()
{
double ma;
int res;
//---- andare a fare trading solo per i primi tik della nuova barra
if(Volume[0]>1) return;
//---- ottenere la media mobile
ma=iMA(NULL,0,MovingPeriod,MovingShift,MODE_SMA,PRICE_CLOSE,0)
//---- condizioni di vendita
if(Open[1]>ma && Close[1]<ma)
{
res=OrderSend(Symbol(),OP_SELL,LotsOptimized(),Bid,3,0,0,",MAGICMA,0,Red);
return;
}
//---- condizioni di acquisto
if(Open[1]<ma && Close[1]>ma)
{
res=OrderSend(Symbol(),OP_BUY,LotsOptimized(),Ask,3,0,0,",MAGICMA,0,Blue);
return;
}
Dimmi dove ho sbagliato plz... o se è MT4 stesso, ma i miei ordini di acquisto si aprono solo sulla barra High, e gli ordini di vendita solo sulla barra Close =) Anche se non ho nemmeno stipulato queste condizioni nel codice dell'Expert Advisor =)