//сначала надо объявить импорт функции из DLL#import "имя_вашей_длл.dll"int SortStringArray(string *arr[],constint arraysize);
#import
//в тексте программы вызов проще простогоstring arr[];
int size;
...
//где-то в коде массив заполняется
...
//а вот и вызов сортировки
SortStringArray(arr,size);
while(true) // Цикл закрытия орд.
{
if (Total==0 && Opn_B==true) // Открытых орд. нет +
{ // критерий откр. Buy
RefreshRates(); // Обновление данных
SL=Bid - New_Stop(StopLoss)*Point; // Вычисление SL откр.
TP=Bid + New_Stop(TakeProfit)*Point; // Вычисление TP откр.Alert("Попытка открыть Buy. Ожидание ответа..");
Ticket=OrderSend(Symb,OP_BUY,Lts,Ask,2,SL,TP);//Открытие Buyif (Ticket > 0) // Получилось :)
{
Alert ("Открыт ордер Buy ",Ticket);
return; // Выход из start()
}
if (Fun_Error(GetLastError())==1) // Обработка ошибокcontinue; // Повторная попыткаreturn; // Выход из start()
}
また、エラー処理機能。
int Fun_Error(int Error) // Ф-ия обработ ошибок
{
switch(Error)
{ // Преодолимые ошибки case4: Alert("Торговый сервер занят. Пробуем ещё раз..");
Sleep(3000); // Простое решениеreturn(1); // Выход из функцииcase135:Alert("Цена изменилась. Пробуем ещё раз..");
RefreshRates(); // Обновим данныеreturn(1); // Выход из функцииcase136:Alert("Нет цен. Ждём новый тик..");
while(RefreshRates()==false) // До нового тикаSleep(1); // Задержка в циклеreturn(1); // Выход из функцииcase137:Alert("Брокер занят. Пробуем ещё раз..");
Sleep(3000); // Простое решениеreturn(1); // Выход из функцииcase146:Alert("Подсистема торговли занята. Пробуем ещё..");
Sleep(500); // Простое решениеreturn(1); // Выход из функции// Критические ошибкиcase2: Alert("Общая ошибка.");
return(0); // Выход из функцииcase5: Alert("Старая версия терминала.");
Work=false; // Больше не работатьreturn(0); // Выход из функцииcase64: Alert("Счет заблокирован.");
Work=false; // Больше не работатьreturn(0); // Выход из функцииcase133:Alert("Торговля запрещена.");
return(0); // Выход из функцииcase134:Alert("Недостаточно денег для совершения операции.");
return(0); // Выход из функцииdefault: Alert("Возникла ошибка ",Error); // Другие варианты return(0); // Выход из функции
}
}
これがプロジェクトの.cppファイルです、見てみてください、GoogleとYandexで何回か検索してみましたが、全く頭でっかちなことはなく、概ね理解できるものです。単純なことのようにさえ思えます。
しかし、その仕組みはどうなっているのでしょうか。このddlをどのように参照するのかよくわからないのですが、EAのコードからですか?どうやって?まず、以下のような感じです。 #include <GetIntValue>.
2.dllを呼び出すときは、studioをオンにしておく必要はないですよね? どのように実行されるのでしょうか?
mqlのコードからこのDLLを呼び出す最も簡単な例を示してください。
ここが分からない...。
2つ目の一方向注文が開設された場合、ロットサイズは指数関数的に(倍率2倍で)増加するはずです。
これが結果です。
すると、このように
というような結果になります。
では、これでおしまいです。
ありがとうございます!なんとなくわかりましたよ。
その線は何のためにあるのですか?
datetime o;
もう一つ質問です。 トレーリングオーダーがあります。一方向注文が1つでも開かれていればすべてうまくいき、それ以上だとなぜかうまくいきません。なぜ?
{
for(int i = 0; i<OrdersTotal(); i++)
{
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
{
if (OrderSymbol() == Symbol() && OrderMagicNumber() == Magic)
{
if (OrderType() == OP_BUY)
{
if(Bid - OrderOpenPrice() > TrailingStop*Point)
{
if (OrderStopLoss() < Bid - (TrailingStop + TrailingStep)*Point)
{
SL = NormalizeDouble(Bid - TrailingStop*Point,Digits);
if (OrderStopLoss() !=SL)
OrderModify(OrderTicket(),OrderOpenPrice(),SL,0,0);
}
}
}
if (OrderType() == OP_SELL)
{
if(OrderOpenPrice() - Ask > TrailingStop*Point)
{
if (OrderStopLoss() > Ask + (TrailingStop+ TrailingStep)*Point)
{
SL = NormalizeDouble (Ask+TrailingStop*Point,Digits);
if (OrderStopLoss() !=SL)
OrderModify (OrderTicket(), OrderOpenPrice(), SL,0,0);
}
}
}
}
}
}
}
これがプロジェクトの.cppファイルです、見てみてください、GoogleとYandexで何回か検索してみましたが、全く頭でっかちなことはなく、概ね理解できるものです。単純なことのようにさえ思えます。
しかし、その仕組みはどうなっているのでしょうか。このddlをどのように参照するのかよくわからないのですが、EAのコードからですか?どうやって?まず、以下のような感じです。 #include <GetIntValue>.
だいたいこんな感じです。これを動作させるには、dllをコンパイルしてexperts/librariesフォルダに入れる必要があります(ヘルプとチュートリアルを読んでください、そこに詳しく書かれています)。
2.dllを呼び出すときは、studioをオンにしておく必要はありませんよね。 では、どのように実行されるのでしょうか?
もう一つ質問です。 トレーリングオーダーがあります。一方向注文が1つでも開かれていればすべてうまくいき、それ以上だとなぜかうまくいきません。なぜ?
{
for(int i = 0; i<OrdersTotal(); i++)
{
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
{
if (OrderSymbol() == Symbol() && OrderMagicNumber() == Magic)
{
if (OrderType() == OP_BUY)
{
if(Bid - OrderOpenPrice() > TrailingStop*Point)
{
if (OrderStopLoss() < Bid - (TrailingStop + TrailingStep)*Point)
{
SL = NormalizeDouble(Bid - TrailingStop*Point,Digits);
if (OrderStopLoss() !=SL)
OrderModify(OrderTicket(),OrderOpenPrice(),SL,0,0);
}
}
}
if (OrderType() == OP_SELL)
{
if(OrderOpenPrice() - Ask > TrailingStop*Point)
{
if (OrderStopLoss() > Ask + (TrailingStop+ TrailingStep)*Point)
{
SL = NormalizeDouble (Ask+TrailingStop*Point,Digits);
if (OrderStopLoss() !=SL)
OrderModify (OrderTicket(), OrderOpenPrice(), SL,0,0);
}
}
}
}
}
}
}
関数にパラメータを渡す必要があるため、次のようにしてください。
bool IfProfTrail=false; // 利益のあるポジションにのみ使用する - Breakevenモード
int TrailingStop=0; // 後続距離 = 0 - 許容最小値
int TrailingStep=1; // 後続距離ステップ
ありがとうございました。
何が問題なのかが理解できました。
購入に際して、私は使用しました。
私の知る限り、買いはaskですが、iClose(Symbol(),Period(),0)はbidから価格を取得します。これがエラーの原因になっている可能性があります。
しかし、ここで疑問が生じます。このEAはPipsベースのEAではないので、価格は長い間買いゾーンにあり、ティックごとに更新されていました。今は次のような組み合わせで使っています。
なぜトレードが始まらないのか?EAがエラーで停止し、それ以上の値動きを見ないことが判明?
Expert Advisor のテンプレートはhttps://c.mql5.com/mql4/book/mq4/experts/tradingexpert.mq4 から取得しました。
ご意見として、このEAのエラー処理機能に129と138のエラーのチェックを追加した方が良いでしょうか?
その場合、どのようにすればよいのでしょうか?
最低限、ポジションを開く/注文を設定するための独自の関数を用意し、すべてのエラーを処理する必要があります。ここで、最新の価格を知る必要があるのです。
ブランクは見ていない。しかし、私は、EAがサーバーから返されるすべてのエラーを処理する必要があると言います。そして、それはまだ十分ではありません。不測の事態が発生しても、機能を失うことなく、アルゴリズムが破綻することなく、何事もなかったかのようにポジションを回復し、作業を継続できることが必要です。
少なくとも、すべてのエラーを処理する、ポジションを開く/注文を設定するための独自の関数を持つ必要があります。最新の価格を知るために必要な場所です。
設計図を見たことがないんです。ただし、サーバーから返されたすべてのエラーをEAで処理する必要があることはお伝えしておきます。そして、これだけでは不十分です。不測の事態が発生しても、機能を失うことなく、アルゴリズムに不具合が発生することなく、何事もなかったかのようにポジションを回復し、作業を継続することができなければならないのです。
テンプレートは教科書から引用しています。エラー処理 関数があまり得意ではないのです。
注文開始時に、RefreshRates();があります(提案されたように、BidsとAsksをMarket Infoで置き換えています)。
また、エラー処理機能。
と聞きたくなりました。お伺いしたいのですが、129のエラーからもう一行追加してもよろしいでしょうか?