そして、それを「漫画」にしよう(多通貨化)

 

本当は何組か同時にテストしたいんですけどね...。

自分ではできない...。多通貨EAを作るのを手伝ってくれるなら)複数のペアを扱う本質を理解できるのですが...。

自分で書いた、5桁分の...。...と、フォーラムから何かをパクった...)

という記述があります。)

//+------------------------------------------------------------------+
//|                                            20090717_H4_Candy.mq4 |
//|                      Copyright © 2009, MetaQuotes Software Corp. |
//|                                        http://www.metaquotes.net |
//+------------------------------------------------------------------+
#property copyright "LITE"
#property link      "http://www.metaquotes.net"

#include <stdlib.mqh>

extern double Profit = 2000;

double Price[2];
int    giSlippage;

int iOrders, i;
double b0, b1, s0, s1, StopLoss, Enter;
bool dwn, up, mod;

//+------------------------------------------------------------------+
//| expert initialization function                                   |
//+------------------------------------------------------------------+
int init()
  {
//----
   Profit*=Point; 
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| expert deinitialization function                                 |
//+------------------------------------------------------------------+
int deinit()
  {
//----
   
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| expert start function                                            |
//+------------------------------------------------------------------+
int start()
  {
//----
   iOrders=OrdersTotal()-1;//количество отложенных ордеров
   
   if(OrdersTotal()==0){
      mod=false;
      SetOrders();}
   
   if((OrdersTotal()>0) && (AccountProfit())&& (! mod)) SetStop();
   
   if(OrdersTotal()>0){
      if( up) UpTrend();
      if( dwn) DownTrend();}

//----
   return(0);
  }
//+------------------------------------------------------------------+

//-------Удаление всех ордеров
void CloseOpenOrdersAndCancelPending()
   {
    for( i= iOrders; i>=0; i--) {
      if(OrderSelect( i, SELECT_BY_POS, MODE_TRADES)) {
        if((OrderType()<=OP_SELL) && GetMarketInfo()) {
          if(!OrderClose(OrderTicket(),OrderLots(), Price[1-OrderType()], giSlippage)) Print( OrderError());
        }
        else if(OrderType()>OP_SELL) {
          if(!OrderDelete(OrderTicket())) Print( OrderError());
        }
      }
    }
  }

//-------Поиск входа для установки ордеров и удаление всех ордеров
bool UpTrend()
  {
     if((iOpen(NULL,PERIOD_H4,1) - iClose(NULL,PERIOD_H4,1) <= 0) &&
        (iOpen(NULL,PERIOD_H4,2) - iClose(NULL,PERIOD_H4,2) > 0)){
         up=false;
         dwn=true;
         //DeleteAllPendingOrders();
         CloseOpenOrdersAndCancelPending();
         return(true);}
     else 
        return(false);
  }
bool DownTrend()
  {
     if((iOpen(NULL,PERIOD_H4,1) - iClose(NULL,PERIOD_H4,1) >= 0) &&
        (iOpen(NULL,PERIOD_H4,2) - iClose(NULL,PERIOD_H4,2) < 0)){
         up=true;
         dwn=false;
         //DeleteAllPendingOrders();
         CloseOpenOrdersAndCancelPending();
         return(true);}
     else 
         return(false);
  }

//-------Установка ордеров  
 void SetOrders()
   {
      if(UpTrend()){
         Enter=iHigh(NULL,PERIOD_H4,1)+(Ask-Bid)+10*Point;
         RefreshRates();
         OrderSend(Symbol(), OP_BUYSTOP, 0.1, Enter, 0, 0, Ask+Profit, 0, 0,0, Green);}
      
      if(DownTrend()){
         Enter=iLow(NULL,PERIOD_H4,1)-10*Point;
         RefreshRates();
         OrderSend(Symbol(), OP_SELLSTOP, 0.1, Enter, 0, 0, Bid-Profit, 0, 0,0, Green);}
   }
   
//-------Вычисление и утановка стопа
void SetStop()
   {
      RefreshRates();
      b0=iLow(NULL,PERIOD_H4,0)-10*Point;
      b1=iLow(NULL,PERIOD_H4,1)-10*Point;
      s0=iHigh(NULL,PERIOD_H4,0)+(Ask-Bid)+10*Point;
      s1=iHigh(NULL,PERIOD_H4,1)+(Ask-Bid)+10*Point;

      
      if(OrderSelect(0, SELECT_BY_POS)){       
         if(OrderType()==OP_BUY){
            if( b0< b1) StopLoss= b1;
            else StopLoss= b0;
            RefreshRates();
            mod=OrderModify(OrderTicket(),OrderOpenPrice(), StopLoss,OrderTakeProfit(),0,Red);
            if( mod) return(true);}
         else{
            if( s0< s1) StopLoss= s0;
            else StopLoss= s1;
            RefreshRates();
            mod=OrderModify(OrderTicket(),OrderOpenPrice(), StopLoss,OrderTakeProfit(),0,Red);
            if( mod) return(true);
         }
      } 
   }
 
//+------------------------------------------------------------------+
//| Function..: OrderError                                           |
//+------------------------------------------------------------------+
string OrderError() {
  int iError=GetLastError();
  return(StringConcatenate("Order:",OrderTicket()," GetLastError()=", iError));
}

//+------------------------------------------------------------------+
//| Function..: GetMarketInfo                                        |
//| Returns...: bool Success.                                        |
//+------------------------------------------------------------------+
bool GetMarketInfo() {
  RefreshRates();
  Price[0]=MarketInfo(OrderSymbol(),MODE_ASK);
  Price[1]=MarketInfo(OrderSymbol(),MODE_BID);
  double dPoint=MarketInfo(OrderSymbol(),MODE_POINT);
  if( dPoint==0) return(false);
  giSlippage=( Price[0]- Price[1])/ dPoint;
  return( Price[0]>0.0 && Price[1]>0.0);
}



 
ALex2008 писал(а)>>

本当は何組か同時にテストしたいんですけどね...。

自分ではできない...。でも、多通貨EAを作るのに協力してもらえるとありがたいです)

自分で書いたのに...。自分で書いて......必要なものはフォーラムから取りました......)

だから、何足かに分けてつけるといいかもしれませんね。

 
Vinin >> :

だから、何足かに分けてつければいいんじゃないかな。

シグナルは現在のペアから取得され、注文の作業は1つのペアに対してのみ行われます(

if(OrdersTotal()==0)...
if(OrdersTotal()>0)...

もちろん、他のペアで信号をつなぐこともできるのですが...。...でも、これでは受注管理ができない...。未だ嘗て)

 
ALex2008 писал(а)>>

シグナルは現在のペアから取得され、注文は1つのペアのために編成されます...。

もしかしたら、誰かがリメイクしてくれるかもしれません。>> 怠け者の私には無理です。

 
Vinin >> :

もしかしたら、誰かがやり直したいと思っているかもしれません。怠け者の私には無理です。

では、待ちます。>> 誰か助けてくれるかもしれませんね)

 
ALex2008 >> :

本当は何足か同時に試着したいのですが...。

自分ではできない...。が、多通貨EAを作るのに協力してくれるとありがたいのですが...)

テスターで 多通貨EAを作ろうと思っても、原理的にテストできない(テスト対象の1ペアのみティックを生成 する)。このため、同じEAであれば、自分の注文と他のEAの注文を、例えばパラメータに設定した同じマジックナンバーを使って区別する必要があります ;)

 
ForexTools >> :

...そのためには、同じアドバイザーが、例えばパラメータに設定された同じマジックによって、自分の命令と他の人の命令を区別できなければなりません ;)

原則的に、本当のマルチになろうが、他の人の注文を見分けようが、私には関係ないことなのです。1ペアではなく、数ペアで取引したい・・・1〜2ヶ月はデモで試したい・・・結果だけが気になる・・・)

 
ForexTools >> :

...これを行うには、同じEAが、例えばそのパラメータに設定された同じマジックによって、自分自身の注文と他の人の注文を区別する必要があります ;)

...または自動 生成 ;))

 
granit77 >> :

...または自動 生成 ;))

マジコンジェネレーターでコードを入れると...。でも、何のために...。アルゴリズムを理解する必要がある)

 

役立つかもしれません。

int Order_Count[6];
//===============================================================================
// Функция возвращаюшая количество ордеров определенного типа исхода из заданных ограничений
//===============================================================================
void Order_Count_Calculate(string _Symbol, int Magic){
   ArrayInitialize( Order_Count,0);
   for (int i = OrdersTotal() - 1;  i >= 0;  i--) {
      if (!OrderSelect( i, SELECT_BY_POS, MODE_TRADES))   continue;
      if (OrderSymbol() != _Symbol)                      continue;
      if (OrderMagicNumber() != Magic)                   continue;
      Order_Count[OrderType()]++;
   }
}
 

ところで、あなたのコードには間違いがたくさんありますね!?

iLow(PERIOD_H4,0,0) - これは何だ?

理由: