bool WriteToFile(int FileHandle,string DataToWrite) { // Receives the number of bytes written to the file. Note that MQL can only pass // arrays as by-reference parameters to DLLs int BytesWritten[1]={0};
// Get the length of the string int szData=StringLen(DataToWrite);
// Do the write WriteFile(FileHandle,DataToWrite,szData,BytesWritten,0);
// Return true if the number of bytes written matches the expected number return (BytesWritten[0] == szData); }
Исполнительная среда MQL4 основана на концепции безопасной "песочницы": чтение и запись средствами языка разрешены только в определенных папках. Это защищает пользователя MetaTrader 4 от потенциальной опасности испортить важные данные на жестком диске компьютера. Но иногда все же бывает необходимость покинуть безопасную зону. Как это сделать легко и правильно - об этом статья.
if(Ask>=FindLastOrderOpenPrice()+Step*Point())//+------------если ордер в плюс и это 5 ордер в списке { ticket=OrderSend(Symbol(),OP_BUY,(лот2 ордера+лот4 ордера),Ask,50,0,0,"",Magic,0,clrAzure); Функция записи(); } и если массив локальный то каким образом я буду оттуда вытаскивать данные в текущую команду? ретурн не возвращает данные массивов, а если засунуть туда выражение извлечения его будет не видно
if(Ask>=FindLastOrderOpenPrice()+Step*Point())//+------------если ордер в плюс и это 5 ордер в списке { ticket=OrderSend(Symbol(),OP_BUY,(лот2 ордера+лот4 ордера),Ask,50,0,0,"",Magic,0,clrAzure); Функция записи(); } и если массив локальный то каким образом я буду оттуда вытаскивать данные в текущую команду? ретурн не возвращает данные массивов, а если засунуть туда выражение извлечения его будет не видно
Vladimir Zubov: 教えてください、なぜチケットとロットを配列に書くのですか、配列の使い方を学ぶため以外にありますか?パソコンの電源を切ると、アレイごとクラッシュしてしまうのですが、そもそもなぜこんなに信頼性の低いものにしたのでしょうか?もちろん、配列の扱い方を学ぶことが目的であれば話は別ですが......)。
voidOnTick() { // Заполняем массивы int b=-1,s=-1; // Объявим переменные с минусом for(int i=0; i<OrdersTotal(); i++) { if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) { if(OrderSymbol()==Symbol() && (OrderMagicNumber()==Magic || Magic<0)) { if(OrderType()==OP_BUY) { b++; ArrayResize(BPosMass,b+1); BPosMass[b][0]= (int)OrderOpenPrice();// Для сортировки = можно сортировать по: OrderProfit(), OrderLots(), OrderTicket(), OrderOpenTime() BPosMass[b][1]= OrderTicket(); // Для чтения } if(OrderType()==OP_SELL) { s++; ArrayResize(SPosMass,s+1); SPosMass[s][0]= (int)OrderOpenPrice();// Для сортировки = можно сортировать по: OrderProfit(), OrderLots(), OrderTicket(), OrderOpenTime() SPosMass[s][1]= OrderTicket(); // Для чтения } }}} // конец записи массив
// Читаем отсортированный массив с тикетами // Buy if(b>0) { // Если он не пустой и больше двух элементов - [0], иначе будет ошибка: "Выход за пределы массива" ArraySort(BPosMass, WHOLE_ARRAY, 0, MODE_ASCEND); // Отсортируем по первому измерению // Работа с полученными данными Comment("Самый старый Buy тикет: ", BPosMass[0][1], "\nПоследний Buy тикет: ", BPosMass[b][1], "\nПредпоследний Buy тикет: ", BPosMass[b-1][1] );
} // end Buy
// Sell if(s>0) { // Если он не пустой и больше двух элементов - [0], иначе будет ошибка: "Выход за пределы массива" ArraySort(SPosMass, WHOLE_ARRAY, 0, MODE_ASCEND); // Отсортируем по первому измерению // Работа с полученными данными Comment("Самый старый Sell тикет: ", SPosMass[0][1], "\nПоследний Sell тикет: ", SPosMass[s][1], "\nПредпоследний Sell тикет: ", SPosMass[s-1][1] );
{
// Receives the number of bytes written to the file. Note that MQL can only pass
// arrays as by-reference parameters to DLLs
int BytesWritten[1]={0};
// Get the length of the string
int szData=StringLen(DataToWrite);
// Do the write
WriteFile(FileHandle,DataToWrite,szData,BytesWritten,0);
// Return true if the number of bytes written matches the expected number
return (BytesWritten[0] == szData);
}
私は翻訳を新しい行にファイルに書きたいが、それは動作しません、このコードはここからですhttps://www.mql5.com/en/forum/118999。
このコードは、各文字の後にスペースを持つ行を書き込みます、私は FileWrite( )の代替が必要ですが、それは動作します
関数とは何か、ぜひご一読ください。そうすれば、関数本体で 宣言された配列はローカルに、つまりプログラムの他の部分からは見えないところに置かれることが理解できるはずです。
つまり、3つの機能が必要です。
1) 宣言する場所
2)どちらで値をつけるか
3) データベースから削除するには、どちらを使用するのでしょうか?
だろう?
つまり、3つの機能が必要です。
1) 宣言する場所
2)どちらで値をつけるか
3) データベースから削除するには、どちらを使用するのでしょうか?
ですよね?
よく読んでみて ください。
よし、注文を2次元配列(チケット+ロット)に書き込むvoid関数を作ろう
写るんです
{
ticket=OrderSend(Symbol(),OP_BUY,(лот2 ордера+лот4 ордера),Ask,50,0,0,"",Magic,0,clrAzure);
Функция записи();
}
и если массив локальный то каким образом я буду оттуда вытаскивать данные в текущую команду?
ретурн не возвращает данные массивов, а если засунуть туда выражение извлечения его будет не видно
よし、注文を2次元配列(チケット+ロット)に書き込むvoid関数を作ろう
写るんです
{
ticket=OrderSend(Symbol(),OP_BUY,(лот2 ордера+лот4 ордера),Ask,50,0,0,"",Magic,0,clrAzure);
Функция записи();
}
и если массив локальный то каким образом я буду оттуда вытаскивать данные в текущую команду?
ретурн не возвращает данные массивов, а если засунуть туда выражение извлечения его будет не видно
教えてください、なぜチケットとロットを配列に書くのですか、配列の使い方を学ぶため以外にありますか?パソコンの電源を切ると、アレイごとクラッシュしてしまうのですが、そもそもなぜこんなに信頼性の低いものにしたのでしょうか?もちろん、配列の扱い方を学ぶことが目的であれば話は別ですが......)。
OK、簡単な方法で凹凸のあるグリッドに6つのオーダーを見つけるか、発券で8つのオーダーを見つけてください。
注文のグリッドがある限り必要だ、あとは転がせ。
さて、上のコードで述べた目標ですがOK、簡単な方法で凹凸のあるグリッドに6つのオーダーを見つけるか、発券で8つのオーダーを見つけてください。
注文のグリッドがある限り必要だ、あとは転がせ。
さて、私は上記のコードで目標を述べました。ここでは、複数のパラメータでソートする機会があるので、2次元の配列が使われています。
私はあなたがそれを使用する方法を理解することを願って、そうでない場合 - フリーランスに)
double SPosMass[][2];
void OnTick()
{
// Заполняем массивы
int b=-1,s=-1; // Объявим переменные с минусом
for(int i=0; i<OrdersTotal(); i++) {
if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
if(OrderSymbol()==Symbol() && (OrderMagicNumber()==Magic || Magic<0)) {
if(OrderType()==OP_BUY) {
b++;
ArrayResize(BPosMass,b+1);
BPosMass[b][0]= (int)OrderOpenPrice();// Для сортировки = можно сортировать по: OrderProfit(), OrderLots(), OrderTicket(), OrderOpenTime()
BPosMass[b][1]= OrderTicket(); // Для чтения
}
if(OrderType()==OP_SELL) {
s++;
ArrayResize(SPosMass,s+1);
SPosMass[s][0]= (int)OrderOpenPrice();// Для сортировки = можно сортировать по: OrderProfit(), OrderLots(), OrderTicket(), OrderOpenTime()
SPosMass[s][1]= OrderTicket(); // Для чтения
}
}}} // конец записи массив
// Читаем отсортированный массив с тикетами
// Buy
if(b>0) { // Если он не пустой и больше двух элементов - [0], иначе будет ошибка: "Выход за пределы массива"
ArraySort(BPosMass, WHOLE_ARRAY, 0, MODE_ASCEND); // Отсортируем по первому измерению
// Работа с полученными данными
Comment("Самый старый Buy тикет: ", BPosMass[0][1],
"\nПоследний Buy тикет: ", BPosMass[b][1],
"\nПредпоследний Buy тикет: ", BPosMass[b-1][1]
);
} // end Buy
// Sell
if(s>0) { // Если он не пустой и больше двух элементов - [0], иначе будет ошибка: "Выход за пределы массива"
ArraySort(SPosMass, WHOLE_ARRAY, 0, MODE_ASCEND); // Отсортируем по первому измерению
// Работа с полученными данными
Comment("Самый старый Sell тикет: ", SPosMass[0][1],
"\nПоследний Sell тикет: ", SPosMass[s][1],
"\nПредпоследний Sell тикет: ", SPosMass[s-1][1]
);
} // end Sell
// Конец функции OnTick()
}
ここでは、複数のパラメータでソートする機会があるので、2次元の配列が使われています。
使い方を理解してほしい、理解できない場合はフリーランスへ)
あらかじめ無次元化したものを取得する方法、空の値では動作しません。
そのままでは無次元ですが、2次元であり、2次元に無次元の要素を入れることができます。
とにかく何をやっているのか、自分のやった仕事の結果がどうあるべきか、考えているのか。それとも、自分で論理を組み立てているのでしょうか?