VPSy

Wszystko co związane z zapleczem technicznym tradera, czyli m.in. komputery, smartfony, tablety, VPS'y itp.
-rookie-
Maniak
Maniak
Posty: 2307
Rejestracja: 13 kwie 2015, 19:00

Re: VPSy

Nieprzeczytany post autor: -rookie- »

sprawsowaną
xD
Chodzi o parser, sparserowaną.

Są jeszcze programy (komendy):
ifconfig
route

Trzeba poszperać po sieci żeby poszukać przykładów użycia np
https://www.thegeekstuff.com/2012/04/route-examples/
https://soisk.info/index.php/Linux_Ubun ... e_sieciami

(ogólnie w linuxie jest komenda man, czyli manual z poziomu terminala. Programy które wyoływane są przez terminal są w katalogu /bin/ , więc jak czegoś nie wiesz to wejdź tam, do tego folderu, przejrzyj co tam jest, i wpisz man grep albo man ifconfig itd. Można łączyć ze sobą kilka programów np man ifconfig | grep ip, czyli wyszukujesz ciągu znaków "ip" poleceniem grep. Znak "|" to operator "bitwise OR", ale to łączy ze sobą komendy w terminalu. Możesz to sprawdzić w jakimkolwiek języku proramownaia co wyjdzie z działania np 5|7 albo 2|2 https://en.wikipedia.org/wiki/Bitwise_operation . Jest też cat, taki odpowiednik notatnika tylko do wyświetlania w konsoli zawartości pliku. I tak dalej, i tak dalej....

-rookie-
Maniak
Maniak
Posty: 2307
Rejestracja: 13 kwie 2015, 19:00

Re: VPSy

Nieprzeczytany post autor: -rookie- »

Jest jeszcze jedna, w sumie najważniejsza kwestia - bezpieczeństwo (Security). Odpalając strategię na tym VPS, tak na prawdę wrzucasz wrażliwe dane, takie jak login i hasło do swojego konta na inny komputer, gdzieś tam, gdzie ten vps ma lokalizację. Ktoś kto ma dostęp do tej "maszyny" może to wykorzystać. Więc może nie warto pakować całej gotówki i używać do tego głównego konta, tylko założyć konto specjalnie do gry przez vps i wpłacać tylko tyle ile jest niezbędne. Jest "kilkuetapowa weryfikacja" przy wypłacaniu środków, więc nawet jak zaloguje się na konto nie wypłaci gotówki, ale nadal udostępniasz dane do konta, i teoretycznie ktoś tam może namieszać. Trzeba też o tym pomyśleć.

Jacek2009
Bywalec
Bywalec
Posty: 14
Rejestracja: 21 wrz 2009, 22:56

Re: VPSy

Nieprzeczytany post autor: Jacek2009 »

Security first
W zasadzie od tego należy zacząć temat VPS,ów, serwerów dedykowanych etc. Czy wobec powyższych rozważań istnieje sposób uruchomienia strategii poza własnym komputerem, serwerem we własnej fizycznie lokalizacji bez wysyłania loginu i hasła, lub przynajmniej bardzo utrudnić ich przechwycenie np. za pomocą precodu Javy? Zamazywanie kodu przed powstaniem precodu - słyszałem, że są takie mozliwości, by nie można go było rozpoznać i analizować. Ma ktoś jakiś pomysł?

-rookie-
Maniak
Maniak
Posty: 2307
Rejestracja: 13 kwie 2015, 19:00

Re: VPSy

Nieprzeczytany post autor: -rookie- »

Jacek2009 pisze:
13 kwie 2020, 18:54
Security first
W zasadzie od tego należy zacząć temat VPS,ów, serwerów dedykowanych etc. Czy wobec powyższych rozważań istnieje sposób uruchomienia strategii poza własnym komputerem, serwerem we własnej fizycznie lokalizacji bez wysyłania loginu i hasła, lub przynajmniej bardzo utrudnić ich przechwycenie np. za pomocą precodu Javy? Zamazywanie kodu przed powstaniem precodu - słyszałem, że są takie mozliwości, by nie można go było rozpoznać i analizować. Ma ktoś jakiś pomysł?
No niestety, ale ja bardzo mało wiem o technicznych aspektach security :? Może byłaby taka możliwość, na przykład stawiając swerwer ftp, albo socket, następnie w kodzie java, w którym jawnie (statycznie) wpisuje się login i hasło, to w tym miejscu dać wyszukiwanie pliku na dysku (czyli File, BuferredReader itp do załadowania pliku z dysku), oczywiście treść tego pliku byłaby zahaszowana, może sha256, bo są takie kryptery w standardowej bibliotece. Wtedy postawiłbyś na tym vps serwer na socketach, a ze swojego domu łączyłbyś się jako klient przez ten socket (nawet socket java), następnie wysyłał tam plik z hasłem, strategia (kod java) odczywtywała by ten plik w tym miejscu i ładowała dane do tych zmienychh, do połączenia się. Następnie byłoby połączenie. Ale czy to by działało :| Jedynie takie coś przychodzi mi do głowy teraz.

Jak zrobić prosty serwer to trzeba szukać w google pod hasłem simple java socket server https://www.google.com/search?source=hp ... ent=psy-ab

https://cs.lmu.edu/~ray/notes/javanetexamples/
Najprostsza implementacja serwera wygląda tak: I wysyła się tym tekst, czyli można by zahashować tekst w tym przykładzie.

Kod: Zaznacz cały

import java.io.IOException;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Scanner;
import java.util.concurrent.Executors;

/**

 * https://cs.lmu.edu/~ray/notes/javanetexamples/
 
 * A server program which accepts requests from clients to capitalize strings.
 * When a client connects, a new thread is started to handle it. Receiving
 * client data, capitalizing it, and sending the response back is all done on
 * the thread, allowing much greater throughput because more clients can be
 * handled concurrently.
 */
public class CapitalizeServer {

    /**
     * Runs the server. When a client connects, the server spawns a new thread to do
     * the servicing and immediately returns to listening. The application limits
     * the number of threads via a thread pool (otherwise millions of clients could
     * cause the server to run out of resources by allocating too many threads).
     */
    public static void main(String[] args) throws Exception {
        try (var listener = new ServerSocket(59898)) {
            System.out.println("The capitalization server is running...");
            var pool = Executors.newFixedThreadPool(20);
            while (true) {
                pool.execute(new Capitalizer(listener.accept()));
            }
        }
    }

    private static class Capitalizer implements Runnable {
        private Socket socket;

        Capitalizer(Socket socket) {
            this.socket = socket;
        }

        @Override
        public void run() {
            System.out.println("Connected: " + socket);
            try {
                var in = new Scanner(socket.getInputStream());
                var out = new PrintWriter(socket.getOutputStream(), true);
                while (in.hasNextLine()) {
                    out.println(in.nextLine().toUpperCase());
                }
            } catch (Exception e) {
                System.out.println("Error:" + socket);
            } finally {
                try {
                    socket.close();
                } catch (IOException e) {
                }
                System.out.println("Closed: " + socket);
            }
        }
    }
}
Nawet teraz możesz sprawdzić, skompilować to javac CapitalizeServer.java && java CapitalizeServer
odplić na swoim kompie, i potem połączyć się przez telnet i z tym pogadać.
telnet localhost 59898 albo telnet 192.168 (jeśli taki masz adres lokalny swojego komputera) i port

Obsługa plików jest na jforex wiki
https://www.dukascopy.com/wiki/en/devel ... ars-in-csv
https://www.dukascopy.com/wiki/en/devel ... a-from-csv
To jest potrzebne raczej, bo w linuxie wszystko to pliki, więc ten strumień (tekst) trzeba gdzieś przekierować, zapisać do jakiegoś pliku pewnie, i potem właśnie z poziomu strategii załadować treść tego pliku i wpisać do zmiennych login i hasło.

Ale trzeba by to przetestować czy takie coś w ogóle ma racje bytu, czy to faktycznie może jakoś zabezpieczyć łączenie się itd.

-rookie-
Maniak
Maniak
Posty: 2307
Rejestracja: 13 kwie 2015, 19:00

Re: VPSy

Nieprzeczytany post autor: -rookie- »

Teraz chwilę siadłem nad tym co napisałem i jednak byłem w błędzie :roll: Chyba nie da się w łatwy sposób odkodować wiadomości sha256, a ta zahaszowana wiadomość jest bezużyteczna w tym przypadku. Zresztą nie wiem, nie grzebałem się do tej pory w tych skryoptach, kryptografii itp. Ale takie coś chciałem zrobić i w sumie jest to bezużyteczne, bo do tych zmiennych trzeba wstawić konkretny login i hasło. Więc może to jest jakaś metoda, ale trzeba użyć innego skryptu kodującego i rozkodywującego.

Kod: Zaznacz cały

MessageDigest digest = MessageDigest.getInstance("SHA-256");
        byte[] encodedhash = digest.digest("test".getBytes(StandardCharsets.UTF_8));
        String decodehash = Base64.getEncoder().encodeToString(encodedhash);
        System.out.println(encodedhash.hashCode() + " " + decodehash);
Ogólnie zacząłem robić to na Linux Ubuntu 14.04 LTS i IntelliJ IDEA 2019.2.2
1. Pobierasz projekt SDK ze strony i rozpakowujesz jak w tej instrukcji https://www.dukascopy.com/wiki/en/devel ... n-intellij
2. Chile potrwa synchronizacja, u mnie trwało to około 3 minut. Potem masz cały projekt zaimportowany i możesz edytować plik Main z /JForex-3-SDK/src/singlejartest/
3. Otwierasz na próbę konto demo, żeby mieć login i hasło do testów na tym koncie.
4. Wklepujsz do lini 49 i 50 w pliku Main.java gdzie są te linie ten login i hasło i uruchamiasz tą testową strategię w inteliij Run albo shift + F10
private static String userName = "username";
private static String password = "password";
Plik Main z /JForex-3-SDK/src/singlejartest/

Kod: Zaznacz cały

/*
 * Copyright (c) 2018 Dukascopy (Suisse) SA. All Rights Reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions are met:
 *
 * -Redistribution of source code must retain the above copyright notice, this
 *  list of conditions and the following disclaimer.
 *
 * -Redistribution in binary form must reproduce the above copyright notice,
 *  this list of conditions and the following disclaimer in the documentation
 *  and/or other materials provided with the distribution.
 *
 * Neither the name of Dukascopy (Suisse) SA or the names of contributors may
 * be used to endorse or promote products derived from this software without
 * specific prior written permission.
 *
 * This software is provided "AS IS," without a warranty of any kind. ALL
 * EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND WARRANTIES, INCLUDING
 * ANY IMPLIED WARRANTY OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE
 * OR NON-INFRINGEMENT, ARE HEREBY EXCLUDED. DUKASCOPY (SUISSE) SA ("DUKASCOPY")
 * AND ITS LICENSORS SHALL NOT BE LIABLE FOR ANY DAMAGES SUFFERED BY LICENSEE
 * AS A RESULT OF USING, MODIFYING OR DISTRIBUTING THIS SOFTWARE OR ITS
 * DERIVATIVES. IN NO EVENT WILL DUKASCOPY OR ITS LICENSORS BE LIABLE FOR ANY LOST
 * REVENUE, PROFIT OR DATA, OR FOR DIRECT, INDIRECT, SPECIAL, CONSEQUENTIAL,
 * INCIDENTAL OR PUNITIVE DAMAGES, HOWEVER CAUSED AND REGARDLESS OF THE THEORY
 * OF LIABILITY, ARISING OUT OF THE USE OF OR INABILITY TO USE THIS SOFTWARE,
 * EVEN IF DUKASCOPY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
 */
package singlejartest;

import com.dukascopy.api.Instrument;
import com.dukascopy.api.system.ClientFactory;
import com.dukascopy.api.system.IClient;
import com.dukascopy.api.system.ISystemListener;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.nio.charset.StandardCharsets;
import java.security.MessageDigest;
import java.util.Base64;
import java.util.Set;
import java.util.HashSet;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import java.util.StringTokenizer;

/**
 * This small program demonstrates how to initialize Dukascopy client and start a strategy
 */
public class Main {
    private static final Logger LOGGER = LoggerFactory.getLogger(Main.class);

    private static String jnlpUrl = "http://platform.dukascopy.com/demo/jforex.jnlp";
    private static String userName = "username";
    private static String password = "password";

    private static IClient client;

    private static int lightReconnects = 3;

    public static void main(String[] args) throws Exception {
        //get the instance of the IClient interface
        client = ClientFactory.getDefaultInstance();

        MessageDigest digest = MessageDigest.getInstance("SHA-256");
        byte[] encodedhash = digest.digest("test".getBytes(StandardCharsets.UTF_8));
        String decodehash = Base64.getEncoder().encodeToString(encodedhash);
        System.out.println(encodedhash.hashCode() + " " + decodehash);

        loadFile("/tmp/test.txt");

        setSystemListener();
        tryToConnect();
        subscribeToInstruments();

        LOGGER.info("Starting strategy");
        client.startStrategy(new MA_Play());
        //now it's running
    }

    private static void loadFile(String path) throws IOException {
        File file = new File(path);
        BufferedReader buf = new BufferedReader((new FileReader(file)));
        String line = null;
        while ((line = buf.readLine()) != null) {
            StringTokenizer st = new StringTokenizer(line, ",");
            //System.out.println(st.nextToken());
            //System.out.println(st.nextToken());
            userName = st.nextToken();
            password = st.nextToken();
        }
        buf.close();
    }

    private static void setSystemListener() {
        //set the listener that will receive system events
        client.setSystemListener(new ISystemListener() {

        	@Override
        	public void onStart(long processId) {
                LOGGER.info("Strategy started: " + processId);
        	}

			@Override
			public void onStop(long processId) {
                LOGGER.info("Strategy stopped: " + processId);
                if (client.getStartedStrategies().size() == 0) {
                    System.exit(0);
                }
			}

			@Override
			public void onConnect() {
                LOGGER.info("Connected");
                lightReconnects = 3;
			}

			@Override
			public void onDisconnect() {
                tryToReconnect();
			}
        });
    }

    private static void tryToConnect() throws Exception {
        LOGGER.info("Connecting...");
        //connect to the server using jnlp, user name and password
        client.connect(jnlpUrl, userName, password);

        //wait for it to connect
        int i = 10; //wait max ten seconds
        while (i > 0 && !client.isConnected()) {
            Thread.sleep(1000);
            i--;
        }
        if (!client.isConnected()) {
            LOGGER.error("Failed to connect Dukascopy servers");
            System.exit(1);
        }
    }

    private static void tryToReconnect() {
        Runnable runnable = new Runnable() {
            @Override
            public void run() {
                if (lightReconnects > 0) {
                    client.reconnect();
                    --lightReconnects;
                } else {
                    do {
                        try {
                            Thread.sleep(60 * 1000);
                        } catch (InterruptedException e) {
                        }
                        try {
                            if(client.isConnected()) {
                                break;
                            }
                            client.connect(jnlpUrl, userName, password);

                        } catch (Exception e) {
                            LOGGER.error(e.getMessage(), e);
                        }
                    } while(!client.isConnected());
                }
            }
        };
        new Thread(runnable).start();
    }

    private static void subscribeToInstruments() {
        Set<Instrument> instruments = new HashSet<>();
        instruments.add(Instrument.EURUSD);
        LOGGER.info("Subscribing instruments...");
        client.setSubscribedInstruments(instruments);
    }
}

Może to by działało ale potrzeba innej metody kodowania wiadomości...

rookie1
Stały bywalec
Stały bywalec
Posty: 27
Rejestracja: 15 maja 2020, 13:39

Re: VPSy

Nieprzeczytany post autor: rookie1 »

Akurat odpaliłem teraz EA, w sumie to chyba kilka będę odpalał żeby sobie działały. Dopiszę jeszcze coś na temat tego VPS i uruchamiania SDK.

Więc budowałem teraz jar w intelijj community 2019.2. Nie bardzo wiedziałem jak to zrobić. W Eclipse z tego co pamiętam jest prościej. No to hasło do google how to build jar intellij i jest tutaj https://stackoverflow.com/questions/108 ... j-properly
czyli to są te kroki do zrobienia

Kod: Zaznacz cały

    File > Save All.
    Run driver or class with main method.
    File > Project Structure.
    Select Tab "Artifacts".
    Click green plus button near top of window.
    Select JAR from Add drop down menu. Select "From modules with dependencies"
    Select main class.
    The radio button should be selecting "extract to the target JAR." Press OK.
    Check the box "Build on make"
    Press apply and OK.
    From the main menu, select the build dropdown.
    Select the option build artifacts.
Takie ścieżki do Main i do manifest podawałem ale domyślnie jest to /rc/ a nie jak tutaj wpisałem /src/singlejartest, więc jakby nie działało to domyślnie /rc/ . Potem z górnego menu Build > Build Artifact i na środku pojawi się mała lista i z tego Build i to utworzy po chwili jar.
abc12hj12bh5j12.png
I potem po zbudowaniu tego projektu według tych kroków plik jar pojawił się u mnie w katalogu gdzie był projekt pod taką ścieżką JForex-3-SDK/classes/artifacts/JForex_3_SDK_jar

Potem już z górki. Trzeba to wysłać na vps, z linuxa można użyć scp, tak jak napisałem wyżej (ale najpierw lepiej sprawdzić u siebie na kompie, uruchamiając to czy nie ma błędów)
scp JForex_3_SDK.jar root@adres_ip:/home/

potem logujemy się na VPS ssh root@ip_servera, podajemy swoje login i hasło i w terminalu odpalamy proces, czyli ten plik jar i robiomy przekierowanie żeby logi wypluwało do pliku tekstowego, czyli tworzymy w /var/www/html/ folder np jforex i tam plik logs.txt,czyli
cd /var/www/html/
mkdir jforex
cd jforex
touch logs.txt

potem przechodzimy do folderu gdzie jest strategia odpalenie strategii, pewnie będzie to cd /home/ i odpalamy
java -jar JForex_3_SDK.jar > /var/www/html/jforex/logs.txt
trzeba poczekać chwilę aż wyrzuci wszystkie logi, na końcu są dane o stanie konta, dźwigni itp. potem jeszcze parę linijek i to jest koniec. Wtedy można to zatrzymać
CTRL + Z
następnie wpisać bg i wcisnąć enter
bg i enter, proces działa w tle
Następnie można srapwdzić czy ten proces już działa wpisując po prostu bg lub ps aux lub ps aux | grep java czyli szukamy słów java w wyniku wyszukiwania w ps aux, a sam ps aux pokazuje listę uruchomionych procesów. Albo top - to też pokazuje uruchomione procesy.

To przekierowanie powoduje że potem możemy odczytywać logi przez przeglądarkę chociazby wpisaując w adresie ip i ścieżka do tego pliku logs.txt, czyli dajmy na to 182.52.67.25/jforex/logs.txt
============================================================================
Jeszcze sprawa performance, bo w sumie dopiero teraz widzę że to może być problematyczne na słabym vps. Jak kod jest kijowy i robi sporo pętli, róznego rodzaju sprawdzania, rzuca jakieś wyjątki itd może to powodować że cały program będzie wykonywał się dość wolno. Ostatnio właśnie sprawdzałem performance jednej strategii i jit i cache dopiero po kilku obrotach pętli chyba zaczęło działać, optymalizować ten kod czy co tam się dzieje pod spodem (bo w sumie to java znam słabo raczej). W każdym razie pierwsze wykonywanie fukcji było wolne, nawet 60 ms, dopiero potem się rozpędziło i robiło program poniżej 1 milisekundy. Sobie sprawdzałem po prostu System.nanoTime niektóre fragmenty kodu. Więc wniosek jest z tego, że wymagająca strategia będzie potrzebowała mocniejszego VPS, ale na takie niezbyt skomplikowane, które mają kilkanaście warunków do sprawdzenia przed otwarciem pozycji wystarczy ten za 14 zł z groszami.

Chyba już wszystko co istotne opisałem. :>
Nie masz wymaganych uprawnień, aby zobaczyć pliki załączone do tego posta.

JarlCarmen

Re: VPSy

Nieprzeczytany post autor: JarlCarmen »

Jakie aktualnie polecacie vpsy na Linuxie stabilne bez restartów i w miarę tanie? Mam konto w icmarket. Znalazłem tani vps na ovh za 15 zł z Ubuntu.

rookie2
Pasjonat
Pasjonat
Posty: 399
Rejestracja: 29 wrz 2020, 00:10

Re: VPSy

Nieprzeczytany post autor: rookie2 »

JarlCarmen pisze:
23 sie 2020, 01:13
Jakie aktualnie polecacie vpsy na Linuxie stabilne bez restartów i w miarę tanie? Mam konto w icmarket. Znalazłem tani vps na ovh za 15 zł z Ubuntu.
hm, nie miałem jeszcze VPS z linuxem i dostępem w trybie graficznym (tylko konsola), ale jeśli chodzi o restart albo częste migracje to w linuxie jest crontab, czyli polecenie

Kod: Zaznacz cały

crontab -e
I dla przykładu, te strategie w java co opisywałem wyżej uruchamiam mniej więcej takim poleceniem, tzn mam dodane do crontab takie coś

Kod: Zaznacz cały

@reboot cd / && cd /home/wejście_do_folderu_z_plikiem/ && /usr/bin/java -cp  moja_aplikacja.jar singlejartest.Main >/var/www/html/ścieżka_do_logów/logs.txt 2>&1 
I przechodząc do sedna sprawy. Jak już masz zainstalowane MT4 na wine, i masz ikonę na pulpicie MT4 ICMarkets, to wchodzisz prawym przyciskiem myszy w properties i kopiujesz polecnie z okienka "Command", coś takiego

Kod: Zaznacz cały

env WINEPREFIX="/home/home/.wine" wine C:\\windows\\command\\start.exe /unix "/home/home/.wine/drive_c/Program Files (x86)/MetaTrader 4 IC Markets/terminal.exe"
Plik otwarty z crontab -e wygląda mniej więcej tak. Czyli po dyrektywie @reboot dopisujesz tę komendę. I powinno odpalać przy restarcie serwisowym vpsa aplikację jakie tam chcesz żeby się uruchamiały przy starcie systemu

Kod: Zaznacz cały

# Edit this file to introduce tasks to be run by cron.
#
# Each task to run has to be defined through a single line
# indicating with different fields when the task will be run
# and what command to run for the task
#
# To define the time you can provide concrete values for
# minute (m), hour (h), day of month (dom), month (mon),
# and day of week (dow) or use '*' in these fields (for 'any').#
# Notice that tasks will be started based on the cron's system
# daemon's notion of time and timezones.
#
# Output of the crontab jobs (including errors) is sent through
# email to the user the crontab file belongs to (unless redirected).
#
# For example, you can run a backup of all your user accounts
# at 5 a.m every week with:
# 0 5 * * 1 tar -zcf /var/backups/home.tgz /home/
#
# For more information see the manual pages of crontab(5) and cron(8)
#
# m h  dom mon dow   command

#@reboot cd / && /usr/bin/java -cp /home/home/tmp/test/ Main >/dev/null 2>&1
@reboot env WINEPREFIX="/home/home/.wine" wine C:\\windows\\command\\start.exe /unix "/home/home/.wine/drive_c/Program Files (x86)/MetaTrader 4 IC Markets/terminal.exe"
Więcej o crontab poszukaj w sieci.
https://www.myfxbook.com/members/rookie_t/pycha-kroczy-przed-upadkiem/7931743

ODPOWIEDZ