Prośba o pomoc w napisaniu skryptu

O jezykach programowania w platformach i nie tylko.
alien1983
Stały bywalec
Stały bywalec
Posty: 28
Rejestracja: 13 paź 2011, 18:14

Prośba o pomoc w napisaniu skryptu

Nieprzeczytany post autor: alien1983 »

Witam
Mam problem ze skryptem na MT4, napisałem n.p.d.m(na podstawie dostępnych mi materiałów) skrypt który ma zadanie:
Wykryć pojedynczą tranzakcie na moim rachunku za pomocą EA (zulutrade) i w zależności od typu zlecenia ma założyć zlecenia oczekujące, w przypadku gdy EA zamknie swoją tranzakcie skrypt również wszystkie zlecenia zamyka.

Czy ktoś za darmo podjął się poprawienia skryptu?

Skrypt ma parę błędów które nie mogę rozwiązać (tak jakby uruchamiał się podwójnie, czasami się zacina , czasami wariuje).

Po uruchomieniu (pierwsze zamkniecie skryptu) poprawia jego działanie (stabilność - skrypt się nie zamyka) - drugie zamknięcie zamyka skrypt (lekkie przewieszenie prawdopodobnie przez pętle (while). Mimo wszystko potrafi się zawiesić lub sam zamykać zlecenia bez wyraźnej przyczyny.

Dodano po 8 minutach:

Skrypt składa się między innymi z elementów kodu ogólnie dostępnego bardziej lub mniej zmodyfikowanego zamkniętego w funkcje (wstawianie zleceń oczekujących, zamykanie wszystkich zleceń)

Kod: Zaznacz cały

int TimeInterval=1; //----pętla czasu 1 - on, 0 - off
string NameTradeMaster;

int start()
  {
  MainProgram();
  return(0);
  } 
//+------------------------------------------------------------------+

void MainProgram()
{
 Print(AccountNumber());
 if (AccountNumber()==5128601)
  {
  while(TimeInterval>0) //----- petla czasu
   {
  
  int cmd,total;
  total=OrdersTotal();
  bool NTM = false;
   //point=MarketInfo(Symbol(),MODE_POINT);
   for(int i=0; i<total; i++)
     {
     if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
        {
        Print("Tutaj komentarz:",OrderComment());
        Print(total);
        //-----IF sprawdza czy master ma otwartą pozycja
        if (OrderComment()!="" && OrderComment()!="p")
            {
               NameTradeMaster=OrderComment();
               Print(NameTradeMaster);
            }
        
        //-----IF otwieranie pozycji   
        if (OrderComment()!="" && OrderComment()!="p" && total == 1)
            {
            cmd=OrderType();
            //---- buy or sell orders are considered
            if(cmd==OP_BUY)
               {
               OpBuyLimit(10,"",0.01);
               OpBuyLimit(11,"",0.01);
               OpBuyLimit(12,"",0.01);
               OpBuyLimit(13,"",0.01);
               OpBuyLimit(14,"",0.01);
               OpBuyLimit(15,"",0.01);
               OpBuyLimit(16,"",0.01);
               OpBuyLimit(17,"",0.01);
               OpBuyLimit(18,"",0.01);
               OpBuyLimit(19,"",0.01);
               }
            if(cmd==OP_SELL)
               {
               OpSellLimit(10,"",0.01);
               OpSellLimit(11,"",0.01);
               OpSellLimit(12,"",0.01);
               OpSellLimit(13,"",0.01);
               OpSellLimit(14,"",0.01);
               OpSellLimit(15,"",0.01);
               OpSellLimit(16,"",0.01);
               OpSellLimit(17,"",0.01);
               OpSellLimit(18,"",0.01);
               OpSellLimit(19,"",0.01);
               }
        }
        //-----IF zamykanie pozycji   
         if (NameTradeMaster==OrderComment())
            {   
            NTM = true;
            Print(NTM);
            }
   }
   if (NTM == false)
            {   
            CloseAllPositions();
            }
   Print("000000000000000000000000000000000");
   Sleep(1000);
   Print("000000000000000000000000000000000");
   }//----pętla czasu
   
   }//-----IF sprawdza rachunek
  }
   //MainProgram();   
   return(0);
}

void OpSellLimit(int pips, string text, double lots)
{
int    ticket,expiration;
   double point;
   double typeorderm;
//----
   point=MarketInfo(Symbol(),MODE_POINT);
   expiration=CurTime()+PERIOD_D1*60;
   typeorderm = OP_SELLSTOP;
//----
   while(true)
     {
      ticket=OrderSend(Symbol(),OP_SELLLIMIT,lots,Bid+pips*10*point,0,0,0,text,16384,expiration,Red);
      if(ticket<=0) Print("Error = ",GetLastError());
      else { Print("ticket = ",ticket); break; }      
      //---- 10 seconds wait
      Sleep(100);
     }
return(0);
}

void OpBuyLimit(int pips, string text, double lots)
{
int    ticket,expiration;
   double point;
   double typeorderm;
//----
   point=MarketInfo(Symbol(),MODE_POINT);
   expiration=CurTime()+PERIOD_D1*60;
   typeorderm = OP_BUYSTOP;
//----
   while(true)
     {
      ticket=OrderSend(Symbol(),OP_BUYLIMIT,lots,Ask-pips*10*point,0,0,0,text,16385,expiration,Blue);
      if(ticket<=0) Print("Error = ",GetLastError());
      else { Print("ticket = ",ticket); break; }      
      //---- 10 seconds wait
      Sleep(100);
     }
return(0);
}

void CloseAllPositions()
{
  int total = OrdersTotal();
  for(int i=total-1;i>=0;i--)
  {
    OrderSelect(i, SELECT_BY_POS);
    int type   = OrderType();

    bool result = false;
    
    switch(type)
    {
      //Close opened long positions
      case OP_BUY       : result = OrderClose( OrderTicket(), OrderLots(), MarketInfo(OrderSymbol(), MODE_BID), 5, Red );
                          break;
      
      //Close opened short positions
      case OP_SELL      : result = OrderClose( OrderTicket(), OrderLots(), MarketInfo(OrderSymbol(), MODE_ASK), 5, Red );
                          break;

      //Close pending orders
      case OP_BUYLIMIT  :
      case OP_BUYSTOP   :
      case OP_SELLLIMIT :
      case OP_SELLSTOP  : result = OrderDelete( OrderTicket() );
    }
    
    if(result == false)
    {
      Alert("Order " , OrderTicket() , " failed to close. Error:" , GetLastError() );
      Sleep(3000);
    }  
  }
  
return(0);
}

Awatar użytkownika
Pierz Andrzej
Przyjaciel Forum
Przyjaciel Forum
Posty: 1200
Rejestracja: 02 lip 2006, 14:17

Nieprzeczytany post autor: Pierz Andrzej »

nie przegladalem calego kodu ...
alejednej rzeczy napewno nie masz i to przewaznie zakloca dzialanie roznych funkcji w petli ;)

Kod: Zaznacz cały

while(true)
{
RefreshRates();
...........
}
pozdrawiam
Andrzej Pierz
z poważaniem
Andrzej Pierz
FOREX-SERVICE

alien1983
Stały bywalec
Stały bywalec
Posty: 28
Rejestracja: 13 paź 2011, 18:14

Nieprzeczytany post autor: alien1983 »

Wielkie dzięki. To wyeliminowało mi błąd o którym nie napisałem tutaj mianowicie odświeżanie cen ask i bid.

Natomiast mam jeszcze jeden problem czasami działający skrypt potrafi mi zamknąć (zlecenie z komentarzem). A normalnie nie powinien takiego zlecenia zamykać

To znaczy podczas wstawiania zlecenie potrafi mi zamknąć takie zlecenie (czasami) lub jezeli takie zlecenie już jest przed uruchomieniem skryptu. Jeżeli go nie zamknie to potem już działa normalnie do kolejnego przypadku.


Wydaje mi się że gdzieś jest błąd w pętli

Awatar użytkownika
Pierz Andrzej
Przyjaciel Forum
Przyjaciel Forum
Posty: 1200
Rejestracja: 02 lip 2006, 14:17

Nieprzeczytany post autor: Pierz Andrzej »

po tej petli tez dajesz RefreshRates( ) ??

Kod: Zaznacz cały

 
   while(TimeInterval>0) //----- petla czasu 
    {
pozdrawiam
Andrzej Pierz
z poważaniem
Andrzej Pierz
FOREX-SERVICE

alien1983
Stały bywalec
Stały bywalec
Posty: 28
Rejestracja: 13 paź 2011, 18:14

Nieprzeczytany post autor: alien1983 »

no właśnie w tej pętli dałem (ale problem z zamykaniem zleceń pojawiał się już wcześniej)

Awatar użytkownika
Pierz Andrzej
Przyjaciel Forum
Przyjaciel Forum
Posty: 1200
Rejestracja: 02 lip 2006, 14:17

Nieprzeczytany post autor: Pierz Andrzej »

a ustaw NTM na true juz tutaj i zobacz wtedy :

Kod: Zaznacz cały

if (OrderComment()!="" && OrderComment()!="p") 
             { 
                NameTradeMaster=OrderComment(); 
                Print(NameTradeMaster); 
NTM = true;
             }
pozdrawiam
Andrzej Pierz
z poważaniem
Andrzej Pierz
FOREX-SERVICE

alien1983
Stały bywalec
Stały bywalec
Posty: 28
Rejestracja: 13 paź 2011, 18:14

Nieprzeczytany post autor: alien1983 »

Niestety nie pomogło po kilkunastu razach zakładania pozycji testowej i zdejmowania jej skrypt sie chyba gdzies zapętla bo chodzi wolniej i zamyka nowo dodaną pozycje z komentarzem :/

Awatar użytkownika
Pierz Andrzej
Przyjaciel Forum
Przyjaciel Forum
Posty: 1200
Rejestracja: 02 lip 2006, 14:17

Nieprzeczytany post autor: Pierz Andrzej »

moze rozdziel to na funkcje .....
w jednej funkcji sprawdzaj warunek czy otwierac zlecenia oczekujace
a w nastepnej dopiero sprawdzaj czy ma zamykac wszystkie i najlepiej zeby jescze byl warunek ze otwrtych zleceni jest wiecej niz 1

pozdrawiam
Andrzej Pierz
z poważaniem
Andrzej Pierz
FOREX-SERVICE

Awatar użytkownika
mike_05
Maniak
Maniak
Posty: 1668
Rejestracja: 02 wrz 2010, 11:55

Nieprzeczytany post autor: mike_05 »

A czy tutaj powinno być "int" czy "datetime" dla expiration?
int ticket,expiration;
double point;
double typeorderm;
//----
point=MarketInfo(Symbol(),MODE_POINT);
expiration=CurTime()+PERIOD_D1*60;
typeorderm = OP_SELLSTOP;
TimeCurrent() to nowa nazwa funkcji CurTime() która obecnie nie działa.
Jeżeli chcesz odnieść sukces, naucz się cenić ludzi.

alien1983
Stały bywalec
Stały bywalec
Posty: 28
Rejestracja: 13 paź 2011, 18:14

Re: Prośba o pomoc w napisaniu skryptu

Nieprzeczytany post autor: alien1983 »

Dzięki za pomoc temat do zamknięcia:)
>WWW< Serwis Internetowy Poświęcony FOREX, CFDs, EA, Programom Afiliacyjnym Forex, Brokerom Forex.

ODPOWIEDZ