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.22 23:44 l 1,23202 1,23203 2018.02.02 22:44 l 1,23202 1,23203 2018.02.02.22 22:45 L 1,23242 1,23203 2018.02.22 22:46 L 1,23251 1,23203 change anything? see...this: string sy=""; int op=-1, mn=-1; ほとんど必要ない ...落とせるか?ループ内では、ネストしたif()の代わりに、continueを使用するのがよいでしょう。
//+------------------------------------------------------------------+ //| Ежеминутная информация об ордерах, открытых за последнее полчаса | //+------------------------------------------------------------------+ #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), "."), ',');
}
FileSeek(File,0,SEEK_END); があり、すべてが改行から ファイルに書き込まれます。
問題は、4つのファイルがあり、それぞれ別のファイルに4つの位置のデータを書き込む必要があるのですが、それぞれのファイルには名前に位置券が付いていますが、データは最後のファイル、最後の位置のデータだけに書き込まれます。
ファイル名は正しく形成されていますか?Ticket=OrderTicket(); File name=_Ticket+Symbol()+".txt" の代わりに File name=(string)OrderTicket()+Symbol()+".txt"; と書き、冒頭に #property strict 命令を追加すると、エラーを排除することができます。
ありがとうございます。ご指摘のとおり名前形成をやり直したのですが、やはり最後の位置のデータしか書き込まれません。
また、新しいファイルの名前は変わっていません)名前ではなく、とにかく最後の位置のファイルが見つかったのではないかと思っています。
なぜ、前のポジションを無視するのか?
1501896125EURUSD.txt
時間 半額 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
時間 半額 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
ということで、このような形で、文字列 sy=""; int op=-1, mn=-1; といった感じで、ほとんど必要ないようです。落とせるか?ループ内では、ネストしたif()の代わりに、continueを使用するのがよいでしょう。
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.22 23:44 l 1,23202 1,23203 2018.02.02 22:44 l 1,23202 1,23203 2018.02.02.22 22:45 L 1,23242 1,23203
2018.02.22 22:46 L 1,23251 1,23203
change anything? see...this: string sy=""; int op=-1, mn=-1; ほとんど必要ない ...落とせるか?ループ内では、ネストしたif()の代わりに、continueを使用するのがよいでしょう。
全ポジションに書き込むのは嫌なんです。
募集職種は7つです。1つのファイルを書きました。
チャート上にあるときにコンパイルしたところ、最初の位置と最後の位置のデータを書き込むようになりました。今、私は最初の位置から1つのデータしか持っていません。
6は見れませんが、Alert(NameFile)に全てのティックを入れています。
何が必要なのか...
if(t_pre+60<TimeCurrent()&& _o_t+1800>TimeCurrent()) // 注文開始から30分に一度。これは必要なことなのでしょうか?
{
t_pre=TimeCurrent();
このプログラムには、ラミネーションが含まれています。
以前、階段で書いたのは何のためだったのでしょうか?旧バージョンのMQL4では、実行速度が速くなりました。今は重要ではありません。
変数_o_tは2か所でしか使われていません。OrderOpenTime() に置き換えると、プログラムは2行(宣言と代入)でスッキリ短くなります
datetime _o_t; および
_o_t=OrderOpenTime();
60秒のカウントダウンは、ループから外す必要があります。
フォーラムユーザーの皆様、こんにちは。
同じ設定でも最適化とテストの結果が異なることがあるのですが、その理由を教えてください。
SQ Tick Downloaderから引用をダウンロードし、スクリプトで実行したところ
こんにちは、親愛なる皆さん。
同じ設定でも最適化とテストの結果が異なることがあるのですが、その理由を教えてください。
もっと言うと、同じブローカーで2つの異なる口座でリアル口座で取引すると、異なる結果が出ることがあります。
それはおそらく、ブローカーによるところが大きいでしょう。でも、最初の質問のヒントをいただけないでしょうか。
それはおそらく、ブローカーによるところが大きいでしょう。しかし、最初の質問に対して、何かアドバイスをいただけないでしょうか。