[ARCHIVE!] フォーラムを散らかさないように、どんなルーキーの質問でも。プロフェッショナルは、通り過ぎないでください。あなたなしではどこにも行けない - 4. - ページ 359

 

みんな、アドバイスしてくれないか。

通貨ペアのMT4配信に含まれる標準的な指標でアドバイザーをテストするとき - 質問なし - すべては、取引アルゴリズムに従って動作します。

銀や金などの金属でテストする場合、注文はオープンされず、Strategy Tester Journalではゼロ分割と書かれています。

同じ入力パラメーターで、この5桁の証券会社(forex4yu)の履歴がテストした商品についてアップロードされているのですが。

考えられる理由は何でしょうか? テレパスにEAを送りたくはない。Expert Advisorは、書籍のバージョンに合わせて 個人的に書きました。

 
Roman.:

みんな、アドバイスしてくれないか。

通貨ペアのMT4配信に含まれる標準的な指標でアドバイザーをテストするとき - 問題なし - すべては、取引アルゴリズムに従って動作します。

銀や金などの金属でテストする場合、注文はオープンされず、Strategy Tester Journalではゼロ分割と書かれています。

同じ入力パラメーターで、この5桁の証券会社(forex4yu)の履歴がテストした商品についてアップロードされているのですが。

考えられる理由は何でしょうか? テレパスにEAを送りたくはない。Expert Advisorは、書籍のバージョンに合わせて 個人的に書きました。

変数で割るときは、まず変数が0でないことを確認する必要があります。
 
Roman.:

みんな、アドバイスしてくれないか。

通貨ペアのMT4配信に含まれる標準的な指標でアドバイザーをテストするとき - 問題なし - すべては、取引アルゴリズムに従って動作します。

銀や金などの金属でテストする場合、注文はオープンされず、Strategy Tester Journalではゼロ分割と書かれています。

同じ入力パラメーターで、この5桁の証券会社(forex4yu)の履歴がテストした商品についてアップロードされているのですが。

考えられる理由は何でしょうか? テレパスにEAを送りたくはない。Expert Advisorは、書籍のバージョンに合わせて 個人的に書きました。


コードが表示されるはずです。一般に、(メモ帳++で)コード中の除算記号が発生するすべての場所に自動的にマークを付け、何らかのケースで実際にゼロによる除算が発生するかどうかを確認することができます。
 
drknn:

ぜひともコードを見てみたいものです。また、一般的には、(メモ帳++で)コード中の除算記号が現れるすべての場所を自動的にマークし、ある場合にゼロによる除算が実際に起こるかどうかをチェックすることができます。


はい、すでに開梱が到達したプリントを見ていますが、そこでは何も問題なく......。

金属のボリュームの正規化機能では、このエラー(ゼロによる分割)があったが、今は存在しない、別の131があった - 明らかに= 0,01ロットを設定したが、不正なボリューム、私は一般に見える...

通貨の場合、この音量正規化機能は正しく動作するのですが...。もしかしたら、(金属と通貨に)共通するものがあるのでは?

//--------------------------------------------------------------------
// Lot_MM.mqh
// 
//--------------------------------------------------------------- 1 --
// Функция вычисления количества лотов.
// Глобальные переменные:
// double Lots_New - количество лотов для новых ордеров (вычисляется)
// double Lots     - желаемое количество лотов, заданное пользовател.
// double  MaksRisk  - процент риска
// Возвращаемые значения:
// true  - если средств хватает на минимальный лот
// false - если средств не хватает на минимальный лот
//--------------------------------------------------------------- 2 --
bool Lot_MM()                            // Позовательская ф-ия
  {
   int time, ticket;                  // Наибольшее время открытия и номер ордера
   double orderLots;                  // Lots   
   double orderProfit;                // Profit
   double Price;                      // Цена открытия рыночного ордера
   double SL;                         // Значение StopLoss ордера
   double  TP;                        // Значение TakeProfit ордера
   string Symb   =Symbol();                    // Финансовый инструм.
   double One_Lot=MarketInfo(Symb,MODE_MARGINREQUIRED);//Размер свободных средств, необходимых для открытия 1 лота
   double Min_Lot=MarketInfo(Symb,MODE_MINLOT);// Мин. размер. лотов
   double Max_Lot =MarketInfo(Symbol(),MODE_MAXLOT);
   double Step   =MarketInfo(Symb,MODE_LOTSTEP);//Шаг изменен размера
   double Free   =AccountFreeMargin();         // Свободные средства
   double LotVal =MarketInfo(Symbol(),MODE_TICKVALUE);//стоимость 1 пункта для 1 лота
   

//--------------------------------------------------------------- 3 --
   if (Lots>0)                                 // Лоты заданы явно..
{                                              // ..проверим это
      double Money=Lots*One_Lot;               // Стоимость открываемого ордера   
      if(Money<=AccountFreeMargin())             // Средств хватает..     
         {  
          Lots_New=Lots;                           // ..принимаем заданное
            // else                                     // Если не хватает..
            // Lots_New=MathFloor(Free/One_Lot/Step)*Step;// Расчёт лотов 
            Print("Функция Lot_MM: Lots_New  = ", Lots_New);    
...
...
...
...
 // ---------НОРМАЛИЗУЕМ НОВЫЕ РАСЧЕТНЫЕ ЛОТЫ И ОТКРЫВАЕМ ОЧЕРЕДНУЮ ПОЗИЦИЮ...            
                    Lots_New = NormalizeLots(Lots_New);  
   return(true);                               // Выход из польз. ф-ии
  }
//--------------------------------------------------------------- 6 --

//+------------------------------------------------------------------+
//| Нормализация лота                                                |
//+------------------------------------------------------------------+

double NormalizeLots(double lot)
{
   double lotStep = MarketInfo(Symbol(), MODE_LOTSTEP);
   double lots = NormalizeDouble(lot / lotStep, 0) * lotStep;   
   lots = MathMax(lots, MarketInfo(Symbol(), MODE_MINLOT));
   lots = MathMin(lots, MarketInfo(Symbol(), MODE_MAXLOT));   
   return (lots);
}
 

トップラインは表示されるのですが、注文はエラー131 - 誤ったボリュームと表示されて開きません。

 Print ("Функция открытия ордера с рынка - продажа: Teeth = ",  NormalizeDouble(Teeth,Digits), " upfractal = ", upfractal," Цена Bid = ", NormalizeDouble(Bid,Digits), " Lots_New = ", NormalizeDouble(Lots_New,2));                
Ticket=OrderSend(Symbol(),1,0.01,Bid,50,0,0,"Antiunity-start",Magic,0,Red);    

 
Techno:
変数で割るときは、まず変数が0でないことを確認する必要があります。

ありがとうございます、今後ともよろしくお願いします。ただ、今回は既成の音量正規化機能を持っていっただけです。
 

今のところ使い道なし...。同じエラーを書き込む...

 Print ("Функция открытия ордера с рынка - продажа: Teeth = ",  NormalizeDouble(Teeth,Digits), " upfractal = ", upfractal," Цена Bid = ", NormalizeDouble(Bid,Digits), " Lots_New = ", NormalizeDouble(Lots_New,2));                
          Ticket=OrderSend(Symbol(),1,Lots_New,Bid,50,0,0,"Antiunity-start",Magic,0,Red);            
          Print ("Функция открытия ордера с рынка - продажа: старт");      

テスターで自分の口座の金のポジションを10,000、0.01、0.1ロットで開設したのですが、無駄になってしまいました。

もしかしたら、同じような問題を抱えた方がいらっしゃるかもしれません。ヒントを教えてください・・・。

 

カスタムサブルーチンに私のロットチェック機能を追加してください。そして、各OrderSend()の前にそれを呼び出します。私のDLでは四捨五入は数学の法則で行われます。四捨五入した数値の末尾が5以上の小数部 であれば、切り上げとなります。<=4 ならば切り捨て。私の理解する限り、プログラミング言語は何らかの理由でこの問題に直面しており、私は独自のDLLコードを作成する必要がありました。基本的にコードは非常にシンプルなのですが、最適解を見つけるまでに、当時はかなりネットで検索しました。dllのソースコードは必要ですか?

// ============ ProverkaLota() =====================================================================
// функция принимает нормализует лот ордера
//-----------------------------------------------------
double ProverkaLota(double LotOrdera,string SMB){
  double SMB_MinLot=MarketInfo(SMB,MODE_MINLOT);
  double SMB_MaxLot=MarketInfo(SMB,MODE_MAXLOT);
  double SMB_LotStep=MarketInfo(SMB,MODE_LOTSTEP);
  LotOrdera=OkruglenieDoSotykh(LotOrdera);// округляем до сотых

 if(SMB_LotStep==0.1){// округляем до десятых
   LotOrdera/=10;
   LotOrdera=OkruglenieDoSotykh(LotOrdera);
   LotOrdera*=10;// возвращаем дробную часть ордера на место
 }
 if(LotOrdera<SMB_MinLot){
   LotOrdera=SMB_MinLot;
 }
 if(LotOrdera>SMB_MaxLot){
   LotOrdera=SMB_MaxLot;
 }
 return(LotOrdera);
}
// =================================================================================================
ファイル:
basic_dll_1.zip  190 kb
 
drknn:

カスタムサブルーチンに私のロットチェック機能を追加してください。そして、各OrderSend()の前にそれを呼び出します。私のDLでは四捨五入は数学の法則で行われます。四捨五入した数値の末尾が5以上の小数部であれば、切り上げとなります。<=4 ならば切り捨て。私の理解する限り、プログラミング言語は何らかの理由でこの問題に直面しており、私は独自のDLLコードを作成する必要がありました。基本的にコードは非常にシンプルなのですが、最適解を見つけるまでに、当時はかなりネットで検索しました。dllのソースコードは必要ですか?


ええ、ありがとうございます。
 
Roman.:

はい、ありがとうございます。


DLL言語:Delphi

library basic;

uses
  SysUtils,Windows,Classes,Dialogs;

{$R *.res}

{Обычно в своих программах не требуется менять модель вызова, delphi по
  умолчанию использует более быстрый fastcall, но при импорте функций из других
  библиотек нужно указывать stdcall (или cdecl для сишных библиотек типа
  msvcrt.dll), иначе просто не будет работать, или будет, но неверно}

// --------- Арифметическое округление до сотых ---------
function OkruglenieDoSotykh(d_ChtoOkruglit:Double):Double; stdcall;
var
  d_Rezult:Double;

begin
  d_Rezult:=Int(d_ChtoOkruglit*100+0.55);
  OkruglenieDoSotykh:=d_Rezult/100;
end;

exports OkruglenieDoSotykh;

begin
end.