[UYARI, KONU KAPALI!] Forumu kirletmemek için herhangi bir acemi sorusu. Profesyonel, kaçırmayın. Sensiz hiçbir yerde. - sayfa 174

 
Lütfen bana söyle. Bir pencerede Uzman Danışmanım var (örneğin, USDJPY), ancak belirli bir anda diğer açık pencerelere oklar ( ObjectCreate ) koymam gerekiyor - örneğin, AUDUSD, EURUSD vb.
 
nicdevis >> :
Lütfen bana söyle. Bir pencerede Uzman Danışmanım var (örneğin, USDJPY), ancak belirli bir anda diğer açık pencerelere oklar ( ObjectCreate ) koymam gerekiyor - örneğin, AUDUSD, EURUSD vb.

ObjectCreate yardımına bakarsanız, yalnızca bir göstergenin veya bir Uzman Danışmanın yerleştirildiği açık bir grafikte çalıştığını açıkça görebilirsiniz. Çıkış yolu, verileri global değişkenler veya bir dosya aracılığıyla gerekli pencerede Expert Advisor'a aktarmak olabilir.

 
granit77 >> :

ObjectCreate yardımına bakarsanız, yalnızca bir göstergenin veya bir Uzman Danışmanın yerleştirildiği açık bir grafikte çalıştığını açıkça görebilirsiniz. Çıkış yolu, verileri global değişkenler veya bir dosya aracılığıyla gerekli pencerede Expert Advisor'a aktarmak olabilir.

Yani, herhangi bir şekilde başka bir pencereden? Teşekkür ederim.

 

Bu bekleyen emir değiştirme işlevi, harici değişkenler aracılığıyla nasıl devre dışı bırakılır?


 //+------------------------------------------------------------------+
//| Модификация ордеров                                              |
//+------------------------------------------------------------------+
void ModifyOrders ( ) {
   bool    fm ;
   double ldStop = 0 , ldTake = 0 ;
   int     spr = MarketInfo ( Symbol ( ) , MODE_SPREAD ) ;
   double pAsk = Ask + ( DistanceSet + spr ) * Point ;
   double pBid = Bid - DistanceSet * Point ;

   for ( int i = 0 ; i < OrdersTotal ( ) ; i + + ) {
     if ( OrderSelect ( i , SELECT_BY_POS , MODE_TRADES ) ) {
       if ( OrderSymbol ( ) = = Symbol ( ) & & OrderMagicNumber ( ) = = MAGIC + 1 ) {
         if ( StopLoss ! = 0 ) ldStop = pAsk - StopLoss * Point ;
         if ( TakeProfit ! = 0 ) ldTake = pAsk + TakeProfit * Point ;
         OrderModify ( OrderTicket ( ) , pAsk , ldStop , ldTake , 0 , clModifyBuy ) ;
       }
       if ( OrderSymbol ( ) = = Symbol ( ) & & OrderMagicNumber ( ) = = MAGIC + 2 ) {
         if ( StopLoss ! = 0 ) ldStop = pBid + StopLoss * Point ;
         if ( TakeProfit ! = 0 ) ldTake = pBid - TakeProfit * Point ;
         OrderModify ( OrderTicket ( ) , pBid , ldStop , ldTake , 0 , clModifySell ) ;
       }
     }
   }
}

//+------------------------------------------------------------------+
//| Возвращает флаг существования ордера или позиции по номеру       |
//+------------------------------------------------------------------+
bool ExistOrder ( int mn ) {
   bool Exist = False ;
   for ( int i = 0 ; i < OrdersTotal ( ) ; i + + ) {
     if ( OrderSelect ( i , SELECT_BY_POS , MODE_TRADES ) ) {
       if ( OrderSymbol ( ) = = Symbol ( ) & & OrderMagicNumber ( ) = = MAGIC + mn ) {
        Exist = True ; break ;
       }
     }
   }
   return ( Exist ) ;
}

//+------------------------------------------------------------------+
//| Возвращает флаг существования позиции по номеру                  |
//+------------------------------------------------------------------+
bool ExistPosition ( int mn ) {
   bool Exist = False ;
   for ( int i = 0 ; i < OrdersTotal ( ) ; i + + ) {
     if ( OrderSelect ( i , SELECT_BY_POS , MODE_TRADES ) ) {
       if ( OrderSymbol ( ) = = Symbol ( ) & & OrderMagicNumber ( ) = = MAGIC + mn ) {
         if ( OrderType ( ) = = OP_BUY | | OrderType ( ) = = OP_SELL ) {
          Exist = True ; break ;
         }
       }
     }
   }
   return ( Exist ) ;
}
 
1Rakso писал(а) >>

Harici değişkenler aracılığıyla devre dışı bırakılan bekleyen siparişleri değiştirme işlevi nasıl yapılır?

 extern bool bModify = false ;
int start ( )
   if ( bModify ) ModifyOrders ( ) ;
   return ( 0 ) ;
}
öyle bir şey
 
Vinin >> :
öyle bir şey

Teşekkür ederim! Vinin!

denemek)

 
Kanal Danışmanı

Programcılar yardım eder, zaten açık olanlar olsa bile danışmanda siparişleri açmanız gerekir. Bu bir kanal danışmanıdır.Her satıra dokunduğunuzda ilgili sırayı açmanız gerekir. Ve sonra bir sipariş açacak ve kapanana kadar diğeri açılmıyor.Şimdiden teşekkürler.



//+------------------------------------------------------------------+
//| TradeChannel.mq4 |
//| Copyright © 2005, Yuri Makarov |
//| http://mak.tradersmind.com |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2005, Yuri Makarov"
#property link "http://mak.tradersmind.com"

extern double Lots = 1.0;
extern int Slippage = 5;
extern int TimeOut = 10000;

double SetLevel(double Level, double NewLevel, string ObjName, int Style)
{
switch (Style)
{
case 1: // Buy Order line
ObjectSet(ObjName,OBJPROP_COLOR,Blue);
ObjectSet(ObjName,OBJPROP_STYLE,STYLE_SOLID);
ObjectSet(ObjName,OBJPROP_WIDTH,2);
break;
case 2: // Sell Order line
ObjectSet(ObjName,OBJPROP_COLOR,Red);
ObjectSet(ObjName,OBJPROP_STYLE,STYLE_SOLID);
ObjectSet(ObjName,OBJPROP_WIDTH,2);
break;
case 3: // Buy Stop line
ObjectSet(ObjName,OBJPROP_COLOR,Blue);
ObjectSet(ObjName,OBJPROP_STYLE,STYLE_DASH);
ObjectSet(ObjName,OBJPROP_WIDTH,1);
break;
case 4: // Sell Stop line
ObjectSet(ObjName,OBJPROP_COLOR,Red);
ObjectSet(ObjName,OBJPROP_STYLE,STYLE_DASH);
ObjectSet(ObjName,OBJPROP_WIDTH,1);
break;
case 5: // Buy Take line
ObjectSet(ObjName,OBJPROP_COLOR,Blue);
ObjectSet(ObjName,OBJPROP_STYLE,STYLE_DOT);
ObjectSet(ObjName,OBJPROP_WIDTH,1);
break;
case 6: // Sell Take line
ObjectSet(ObjName,OBJPROP_COLOR,Red);
ObjectSet(ObjName,OBJPROP_STYLE,STYLE_DOT);
ObjectSet(ObjName,OBJPROP_WIDTH,1);
break;
}

if (MathAbs(NewLevel - Close[0]) < MathAbs(Level - Close[0])) return (NewLevel);
else return (Level);
}

int start()
{
int NumObj = ObjectsTotal();
double Spread = Ask - Bid;

double pBuy = 0;
double pSell = 0;
double pBuyStop = 0;
double pBuyTake = 0;
double pSellStop = 0;
double pSellTake = 0;

for (int i = 0; i < NumObj; i++)
{
string ObjName = ObjectName(i);
string ObjDesc = ObjectDescription(ObjName);
double Price = 0;

switch (ObjectType(ObjName))
{
case OBJ_HLINE:
Price = ObjectGet(ObjName,OBJPROP_PRICE1);
break;
case OBJ_TREND:
Price = ObjectGetValueByShift(ObjName,0);
break;
}

if (Price > 0)
{
if (ObjDesc == "Buy") pBuy = SetLevel(pBuy, Price, ObjName, 1); else
if (ObjDesc == "Sell") pSell = SetLevel(pSell, Price, ObjName, 2); else
if (ObjDesc == "Stop")
{
if (Price < Close[0]) pBuyStop = SetLevel(pBuyStop, Price, ObjName, 3);
else pSellStop = SetLevel(pSellStop, Price, ObjName, 4);
} else
if (ObjDesc == "Take")
{
if (Price > Close[0]) pBuyTake = SetLevel(pBuyTake, Price, ObjName, 5);
else pSellTake = SetLevel(pSellTake, Price, ObjName, 6);
}
}
}

int NumOrders = OrdersTotal();
int NumPos = 0;

for (i = 0; i < NumOrders; i++)
{
OrderSelect(i, SELECT_BY_POS);
if (OrderSymbol() != Symbol()) continue;

NumPos++;

double tp = OrderTakeProfit();
double sl = OrderStopLoss();

if (OrderType() == OP_BUY)
{
if (Bid > pSell && pSell > 0)
{
OrderClose(OrderTicket(), OrderLots(), Bid, Slippage, Red);
Sleep(TimeOut);
return(0);
}
if (MathAbs(tp - pBuyTake) > Spread || MathAbs(sl - pBuyStop) > Spread)
{
OrderModify(OrderTicket(), Ask, pBuyStop, pBuyTake, 0);
Sleep(TimeOut);
return(0);
}
}

if (OrderType() == OP_SELL)
{
if (Ask < pBuy)
{
OrderClose(OrderTicket(), OrderLots(), Ask, Slippage, Red);
Sleep(TimeOut);
return(0);
}
if (MathAbs(tp - pSellTake) > Spread || MathAbs(sl - pSellStop) > Spread)
{
OrderModify(OrderTicket(), Bid, pSellStop, pSellTake, 0);
Sleep(TimeOut);
return(0);
}
}
}

if (NumPos > 0) return(0);
if ((pSell - pBuy) < Spread*2) return(0);

if (Bid > pSell && pSell > pBuyStop)
{
OrderSend(Symbol(), OP_SELL, Lots, Bid, Slippage, pSellStop, pSellTake);
Sleep(TimeOut);
return(0);
}

if (Ask < pBuy && (pBuy < pSellStop || pSellStop == 0))
{
OrderSend(Symbol(), OP_BUY, Lots, Ask, Slippage, pBuyStop, pBuyTake);
Sleep(TimeOut);
return(0);
}
}

int init()
{
return(0);
}

int deinit()
{
return(0);
}

 

Büyük olasılıkla bu satır sizi engelliyor:

if (NumPos > 0) return(0);

İşte nasıl başlayabileceğiniz. Bunu kaldır.

Ve alım ve satım giriş mekanizmasını ayırın. I. Kim'in işlevini alın (kodun en sonuna ekleyin)





 //+----------------------------------------------------------------------------+
//|  Версия   : 19.02.2008                                                     |
//|  Описание : Возвращает количество позиций.                                 |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    sy - наименование инструмента   (""   - любой символ,                   |
//|                                     NULL - текущий символ)                 |
//|    op - операция                   (-1   - любая позиция)                  |
//|    mn - MagicNumber                (-1   - любой магик)                    |
//+----------------------------------------------------------------------------+
int NumberOfPositions ( string sy = "" , int op = - 1 , int mn = - 1 ) {
  int i , k = OrdersTotal ( ) , kp = 0 ;

  if ( sy = = "0" ) sy = Symbol ( ) ;
  for ( i = 0 ; i < k ; i + + )                                    {
    if ( OrderSelect ( i , SELECT_BY_POS , MODE_TRADES ) )      {
      if ( OrderSymbol ( ) = = sy | | sy = = "" )                   {
        if ( OrderType ( ) = = OP_BUY | | OrderType ( ) = = OP_SELL ) {
          if ( op < 0 | | OrderType ( ) = = op )                   {
            if ( mn < 0 | | OrderMagicNumber ( ) = = mn ) kp + + ;
          } } } } }  return ( kp ) ; }

O zaman bir satın alma anlaşması açmanın koşulu şöyle olacaktır:



 if ( NumberOfPositions ( NULL , OP_BUY , -1 ) < 1 ) {
//если нет бай-позиций 



Ve bir satış anlaşması açmanın şartı:



 if ( NumberOfPositions ( NULL , OP_SELL , -1 ) < 1 ) {


 
RomanS писал(а) >>

Bu sorun muhtemelen 2003'ten bile önce çözüldü. Ama başkası bilmediği için paylaşayım)))

Grafiğe sağ tıklayın - özellikleri seçin - genel sekmesi - sabit ölçek için kutuyu işaretleyin - Tamam

Ardından, fareyi fiyat ile ölçeğe doğrultun, sol fare düğmesine basın ve bırakmadan fareyi yukarı / aşağı hareket ettirerek ihtiyacınız olan ölçeği ayarlayın.

Ama uzağa tırmanmamak için ana pencereye getirmek mümkün mü? aksi takdirde tırmanırken zaman kaybedilir ve bu nedenle MT kullanımında sakıncalar vardır.

 
Synax >> :
Kanal Danışmanı

Programcılar yardım eder, zaten açık olanlar olsa bile danışmanda siparişleri açmanız gerekir. Bu bir kanal danışmanıdır.Her satıra dokunduğunuzda ilgili sırayı açmanız gerekir. Ve sonra bir sipariş açacak ve kapanana kadar diğeri açılmıyor.Şimdiden teşekkürler.



Yukarıdaki mesajda anlattıklarımı yaptım. Konum sayısının f'incisini ekledim ve sondaki konum açma bloğunu aşağıdaki ile değiştirdim:

 //if (NumPos > 0) return(0);
if ( ( pSell - pBuy ) < Spread * 2 ) return ( 0 ) ;
//-------------------------------------------------
if ( NumberOfPositions ( NULL , OP_SELL , - 1 ) < 1 ) { //если нет открытых селл-позиций
if ( Bid > pSell & & pSell > pBuyStop )//если условия соответствуют заданным
{//продаем
OrderSend ( Symbol ( ) , OP_SELL , Lots , Bid , Slippage , pSellStop , pSellTake ) ;
Sleep ( TimeOut ) ;
return ( 0 ) ;
} }
//-----------------------------------------------------
if ( NumberOfPositions ( NULL , OP_BUY , - 1 ) < 1 ) { //если нет открытых бай-позиций
if ( Ask < pBuy & & ( pBuy < pSellStop | | pSellStop = = 0 ) )
{// покупаем
OrderSend ( Symbol ( ) , OP_BUY , Lots , Ask , Slippage , pBuyStop , pBuyTake ) ;
Sleep ( TimeOut ) ;
return ( 0 ) ;
} }

Artık danışman aynı anda en az 2 pozisyon tutabilir.

Ne yazık ki işi kontrol edemiyorum çünkü kanalları çizen bir gösterge eklemeyi unuttunuz.

Dosyalar: