C'èFileSeek(File,0,SEEK_END); e tutto viene scritto nel file da una nuova linea.
Il problema è che ci sono 4 file e abbiamo bisogno di scrivere dati su quattro posizioni, ognuno in un file separato, ogni file ha un biglietto di posizione nel nome, ma i dati vengono scritti solo su uno, l'ultimo file, i dati sull'ultima posizione.
I nomi dei file sono formati correttamente? Invece di Ticket=OrderTicket(); File name=_Ticket+Symbol()+".txt"; scriverebbe File name=(string)OrderTicket()+Symbol()+".txt"; e aggiungere la direttiva #property strict all'inizio - aiuta ad eliminare gli errori
STARIJ: I nomi dei file sono formati correttamente? Invece di Ticket=OrderTicket(); File name=_Ticket+Symbol()+".txt"; scriverei File name=(string)OrderTicket()+Symbol()+".txt"; e aggiungere la direttiva #property strict all'inizio - aiuta ad eliminare gli errori
Grazie, la formazione del nome è stata rifatta secondo la tua raccomandazione, ma scrive ancora solo i dati dell'ultima posizione.
E, i nomi dei nuovi file non sono cambiati) sospetto che non sia il nome, il file dell'ultima posizione è stato trovato comunque.
1501896125EURUSD.txt Tempo Metà prezzo BID 2018.02.22 22:53 P 1,23259 0,88322 2018.02.22 22:54 P 1,23259 0,88322 2018.02.22 22:55 P 1,23259 0,88322 2018.02.22 22:56 P 1,23249 0,88322
1501896094EURUSD.txt Tempo Metà prezzo BID 2018.02.22 22:43 L 1,23212 1,23203 2018.02.22 22:44 L 1,23220 1,23203 2018.02.22 22:44 L 1,23224 1,23203 2018.02.22 22:45 L 1,23244 1,23203 2018.02.22 22:45 L 1,23242 1,23203 2018.02.22 22:46 L 1,23251 1,23203 cambiato qualcosa? vedi ... questo: stringa sy=""; int op=-1, mn=-1; appena necessario ... possiamo lasciar perdere? Nel ciclo invece di annidare if() è meglio continuare;
1501896125EURUSD.txt Time Half BID Price 2018.02.22.02.22 22:53 P 1,23259 0,88322 2018.02.22 22:54 P 1,23259 0,88322 2018.02.22 22:55 P 1,23259 0,88322 2018.02.22 22:56 P 1,23249 0,88322
1501896094EURUSD.txt Time Half BID Price 2018.02.22:43 L 1,23212 1,23203 2018.02.22 22:44 L 1,23220 1,23203 2018.02.22 22:44 L 1,23224 1,23203 2018.02.22 22:45 L 1,23244 1,23203 2018.02.02.22 22:45 L 1,23242 1,23203 2018.02.22 22:46 L 1,23251 1,23203 cambiare qualcosa? vedere...questo: stringa sy=""; int op=-1, mn=-1; appena necessario ... possiamo lasciar perdere? Nel ciclo invece di annidare if() è meglio continuare;
Non vuole scrivere su tutte le posizioni.
Ci sono 7 posizioni aperte. Ho scritto un file.
L'ho compilato quando era su un grafico e ha iniziato a scrivere i dati della prima e dell'ultima posizione. Ora ho solo un dato, dalla prima posizione.
Non riesco a vedere sei, ma ho tutte le spunte inAlert(NameFile).
ci sono molte condizioni nel programma, compresa una condizione che deve essere soddisfatta perché il file sia scritto: se(t_pre+60<TimeCurrent() && _o_t+1800>TimeCurrent()) // una volta ogni mezz'ora dall'apertura dell'ordine. È necessario? { t_pre=TimeCurrent(); Il programma contiene ramificazioni:
for(i=0; i<k; i++)
{
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
{
if(OrderSymbol()==sy || sy=="")
{
if(OrderType()==OP_BUY ||
OrderType()==OP_SELL)
{
if(op<0 || OrderType()==op)
{
if(mn<0 || OrderMagicNumber()==mn)
{
_o_t=OrderOpenTime();
И еще 5 закрывающих скобок. а можно короче на 10 строк и понятнее записать так
for(i=0; i<k; i++)
{
if( ! OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) continue; // если ошибка выбора ордера - переходим к следующемуif(OrderSymbol()!=sy && sy!="") continue; // а это вообще надо?if(OrderType()!=OP_BUY && OrderType()!=OP_SELL) continue; // а другие разве у Вас есть?if(op>=0 && OrderType()!=op) continue;
if(mn>=0 && OrderMagicNumber()!=mn) continue;
_o_t=OrderOpenTime();
Qual era lo scopo di scriverlo in una scala prima? Nella vecchia versione di MQL4 accelerava l'esecuzione. Non ha importanza ora La variabile _o_t è usata solo in 2 posti. Se lo sostituiamo con OrderOpenTime(), il programma diventa più chiaro e più corto in 2 righe (dichiarazione e assegnazione) datetime _o_t; e _o_t=OrderOpenTime();
Ho capito - il conto alla rovescia di 60 secondi deve essere tolto dal ciclo
//+------------------------------------------------------------------+ //| Ежеминутная информация об ордерах, открытых за последнее полчаса | //+------------------------------------------------------------------+ #property strictbool RUS=true;
datetime t_pre=0; // Время предыдущего выполнения//+------------------------------------------------------------------+//| |//+------------------------------------------------------------------+voidOnTick()
{
if(t_pre+60>=TimeCurrent()) return; // Дождаться 60 секунд после прошлой обработки
t_pre=TimeCurrent(); // Это нужно вынести за цикл - в этом было дело !!!!!!!!!!!!string text;
for(int i=0; i<OrdersTotal(); i++)
{
if(!OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) continue;
if(OrderType()!=OP_BUY && OrderType()!=OP_SELL) continue;
string ИмяФайла=(string)OrderTicket()+Symbol()+".txt";
Alert(ИмяФайла);
if(OrderOpenTime()+60>=TimeCurrent()) continue; // Пропуск молодых которым меньше 1 минутыif(OrderOpenTime()+1800<=TimeCurrent()) continue; // Пропустк старых которым больше 30 минутif(OrderType()==OP_BUY){if(Bid>OrderOpenPrice())text="P"; else text="L";}
if(OrderType()==OP_SELL){if(Bid<OrderOpenPrice())text="P"; else text="L";}
// Открытие или создание файла и перемещение указателя в конецint Файл= FileOpen(ИмяФайла,FILE_CSV|FILE_READ|FILE_WRITE," ");
if(Файл == -1) { Alert("Ошибка при открытии файла ",ИмяФайла); return; }
FileSeek(Файл,0,SEEK_END);
// Если новый файл записать имя файла и строку заголовков колонокif(FileSize(Файл)==0)
{
FileWrite(Файл,ИмяФайла);
FileWrite(Файл," Время Полу BID Цена ");
}
// Сбор информации и запись в файлFileWrite(Файл, TimeToStr(TimeCurrent()), text,
dstr(Bid), " ", dstr(OrderOpenPrice()));
FileClose(Файл);
}
}
// Преобразование числа double в строку с запятой или точкой в соответствии с локализациейstring dstr(double Цена)
{
if(!RUS) returnDoubleToStr(Цена, Digits);
returnStringSetChar(DoubleToStr(Цена, Digits), StringFind(DoubleToStr(Цена, Digits), "."), ',');
}
Vladislav Andruschenko: Ti dirò di più: quando si fa trading su un conto reale con lo stesso broker su 2 conti diversi, ci possono essere risultati diversi.
Probabilmente dipende più dal broker. Ma potresti darmi un suggerimento sulla domanda iniziale?
C'èFileSeek(File,0,SEEK_END); e tutto viene scritto nel file da una nuova linea.
Il problema è che ci sono 4 file e abbiamo bisogno di scrivere dati su quattro posizioni, ognuno in un file separato, ogni file ha un biglietto di posizione nel nome, ma i dati vengono scritti solo su uno, l'ultimo file, i dati sull'ultima posizione.
I nomi dei file sono formati correttamente? Invece di Ticket=OrderTicket(); File name=_Ticket+Symbol()+".txt"; scriverei File name=(string)OrderTicket()+Symbol()+".txt"; e aggiungere la direttiva #property strict all'inizio - aiuta ad eliminare gli errori
Grazie, la formazione del nome è stata rifatta secondo la tua raccomandazione, ma scrive ancora solo i dati dell'ultima posizione.
E, i nomi dei nuovi file non sono cambiati) sospetto che non sia il nome, il file dell'ultima posizione è stato trovato comunque.
Perché ignora le posizioni precedenti?
1501896125EURUSD.txt
Tempo Metà prezzo BID
2018.02.22 22:53 P 1,23259 0,88322
2018.02.22 22:54 P 1,23259 0,88322
2018.02.22 22:55 P 1,23259 0,88322
2018.02.22 22:56 P 1,23249 0,88322
1501896094EURUSD.txt
Tempo Metà prezzo BID
2018.02.22 22:43 L 1,23212 1,23203
2018.02.22 22:44 L 1,23220 1,23203
2018.02.22 22:44 L 1,23224 1,23203
2018.02.22 22:45 L 1,23244 1,23203
2018.02.22 22:45 L 1,23242 1,23203
2018.02.22 22:46 L 1,23251 1,23203
cambiato qualcosa? vedi ... questo: stringa sy=""; int op=-1, mn=-1; appena necessario ... possiamo lasciar perdere? Nel ciclo invece di annidare if() è meglio continuare;
1501896125EURUSD.txt
Time Half BID Price
2018.02.22.02.22 22:53 P 1,23259 0,88322
2018.02.22 22:54 P 1,23259 0,88322
2018.02.22 22:55 P 1,23259 0,88322
2018.02.22 22:56 P 1,23249 0,88322
1501896094EURUSD.txt
Time Half BID Price
2018.02.22:43 L 1,23212 1,23203
2018.02.22 22:44 L 1,23220 1,23203
2018.02.22 22:44 L 1,23224 1,23203
2018.02.22 22:45 L 1,23244 1,23203
2018.02.02.22 22:45 L 1,23242 1,23203
2018.02.22 22:46 L 1,23251 1,23203
cambiare qualcosa? vedere...questo: stringa sy=""; int op=-1, mn=-1; appena necessario ... possiamo lasciar perdere? Nel ciclo invece di annidare if() è meglio continuare;
Non vuole scrivere su tutte le posizioni.
Ci sono 7 posizioni aperte. Ho scritto un file.
L'ho compilato quando era su un grafico e ha iniziato a scrivere i dati della prima e dell'ultima posizione. Ora ho solo un dato, dalla prima posizione.
Non riesco a vedere sei, ma ho tutte le spunte inAlert(NameFile).
Di cosa ha bisogno...
se(t_pre+60<TimeCurrent() && _o_t+1800>TimeCurrent()) // una volta ogni mezz'ora dall'apertura dell'ordine. È necessario?
{
t_pre=TimeCurrent();
Il programma contiene ramificazioni:
Qual era lo scopo di scriverlo in una scala prima? Nella vecchia versione di MQL4 accelerava l'esecuzione. Non ha importanza ora
La variabile _o_t è usata solo in 2 posti. Se lo sostituiamo con OrderOpenTime(), il programma diventa più chiaro e più corto in 2 righe (dichiarazione e assegnazione)
datetime _o_t; e
_o_t=OrderOpenTime();
Ho capito - il conto alla rovescia di 60 secondi deve essere tolto dal ciclo
Buon pomeriggio, cari utenti del forum.
Puoi dirmi perché l'ottimizzazione e il test delle stesse impostazioni a volte producono risultati diversi?
Ho scaricato le citazioni da SQ Tick Downloader e le ho fatte passare attraverso lo script
Buon pomeriggio, cari amici.
Puoi dirmi perché l'ottimizzazione e il test delle stesse impostazioni a volte producono risultati diversi?
Ti dirò di più: quando si fa trading su un conto reale con lo stesso broker su 2 conti diversi, ci possono essere risultati diversi.
Probabilmente dipende più dal broker. Ma potresti darmi un suggerimento sulla domanda iniziale?
Probabilmente dipende più dal broker. Ma potresti dare qualche indicazione sulla domanda iniziale?