0111100010101010000100010010110001100011100000110111011100100110111001110100010101111100001001010011110101001101100001000111000101011110100100100011111111110111101001100000100110001100011111101010110110000110001110111111100010000000100110101001000010101011001000011011011000100011010110101101101010110001100100100110000011101010101000001100010000001000110111001101101011111101101100101001100011000110 1001101011110010110010100000010100011000011010011111011000111111100110111101111011101110100001001011000100110111101011010001101101111110010001101101011000110100101010111000000111010110111110110000011000110000110111111001101011000111111111101010101001000000010111011110010000001011110111000100101110011100010001101011111001110110101011110101010000101111011000111110101111010000100110000110101101010110 1011000100011111111111110001111000010000000101111111111111100000010000011011010101011000000011110011101001111000110110011100111011100110100001001111100001110010110110110110110001111101110110111010101101100101001110001011010110001100011001111001000000100011100000101100011001011000100101001000001000010100000111011100011100000101010001011000111011000011010000110101101110001011010100000111000111001001 0101111001111100101001011001001110111000000110100110010011110100000110000001001100110000010111101001010010101000100001111001001000101011010111011001011110110001111110101000010011000011100000010100110010001100110101100010000001110100110100101110110010001111111110000111010000100100110000000010011001101000100111111101101000000011011010101010010011010111101000110111000101000010011010010011101101101011 0011100100111001101010001100001111001001100010110110101010000110100001001001101001011100001100101101011011001101100010010000001111111001101010000001101110101011001010111000111100100110001010111000100101101011100001100100100011111010000001011010101010101001001010101101000100111001010110110110001011110010101001000100000111010100110011101000000111000011100100000100100101110101111011110010101111010010 1001110110011010110100110000100010110100010110101100000011010001101100110111101010000110111101000011111110110101010100111111000001101000000011000000011000111111100110111111111010011001010010010111001010001101100011001111111000101111110100101000001101101100001101001111000000111100011100101000111111010100001010010110100110010101111101110010011000000100001000010010000110100010010011101011001001101011 0000111010101111100001011000110000000000110010000011110110000000110011001010110100011101100000010001111001111010101111100100001011100100001100101101101010110100001111110111111010011011100100001010001001111101000010100001001111100001000011100111110111100110000001100000000010100110111001111110111010000101010001001101001101000011101000001110100110101110001110111111010100110000110101111001000110010110 0111000000101110010011101000101000101101010001110011001000011001111101001110111111101000001110011100000111000101001110111001100000101001011010100000010011110010011000111101000101101101001010001001000100001010001100001110000100001100000000101100001000001000001000001010001101011100100101111000101011010110000101001111101010001011001010111000101101010011100100001011010111110110100101001100111011001011 0100000010001000101101011000011111010101001101001111111011010101111110000000001001010110101111110000111100010100111101111010110111001010011101000110101011100100101100011011110100011111001010010111000110010000101100101100011100010010011101110110111001011010101010011101011010100100000001010111101101100001100001100110000000100000110010000010001010101011000011001101101111110111000100000101110011110110 0101100101001000001010010000011111010000101100110010010100000110110010111100000000010110101010100001011111101001101000111110100100001111011010011001110011000011011100010101001111001011000011101110110111001000001011001001010100011111100010010100001111010001010011110101001001110100010101011010100001011010101001111010111101010011110001000011000101100101000001010010111111010001010001011011110011100101 1001110010110100101010010111011111111100001000000010010000101010100110100111101010010000101011011010011111011111111110101001010001000100011100111110001110100101011000011100011011110000110001001011000101001001101111000101111001001101001000111000010010101000111001010111000101110110110100110101110010001000000010000011100111010001101010111100100100100111011100101001111111110000011011111111000000000001 1111001001100010010000111001111101000100000011111101011101010010011010000110110111111111000100000010110000010110101100010111111000000110110110100110001001100101010111011011000001111000011000010101011011100010111111010000000100000000110110010010001100001110101010100001110011111011010100000000011011100010000001110011000101111100100000111100010111000010000010100000111101100100011000101100001100110010 0111011011010101101001010111001111001110010010000010011000010101101001110100101101110001100111110000011100111100001000100000110110110010001101101101001100011010111110100011001011100001110011100101101000010110100100000100000111111111001000110100100111000100001011110001101011010101101100010001001000011111011101111100011001111000001100000111000001111001111001010000110101011001010111010011100111011101 0011111011100001010101011001100101111101100000111100110000001111100110110011010100101010000101001100111111010001010111101010000100111011011101011001010110001010011000001011001000111000010111110111010001111111001010111110100101111101011100011000001101101000000010000100010010001011111010111100001011100000101110110111011010101010011111110011011011010001110001011000000101110010000010100110000110011000 0100000110010001011001101010001001011101011011111001101100011100111101010010100100111011111000000110000001001000111111011010101100010010010001111101110110010111101011101101110110110101000010110010110110010011101010001011101100001001111011101001111101111011110100001101100011011110011111111000100011110011001101100010010010000011101100101011000001011001110011111000001000101100010011111000100110101110 0010000011010100101110000000001010010011110101010111100001110100010001000110010101001010000101101001010110001100011101110010101111011001111011101000111001010000011010100011000110110111110100101000101001010111111110011001111000101010101110010000110101110110111001010011111110111001100110000010010000101110010011111101011011010101010000101100011101010010101110110101100011111000100010010000011001110000 1010001101010000010100011101001100100011011010111111111000100011110000000100000100000010011010001001100000000011110100100110110110111001111011001000100000000010000010011111001100111011000001000101100011011100010000111100010001011010010110010100001111010100000000001110011010111111011110010000011101010000011101011111101111010110110001110111010110100011100000111111010010000000000110001110100000111111 0010110011101100010000101110100101110011101000011001011110000100001010011001011000010010101010011000110111100110001000000101011011111011010000001101001110000100001011111110010101010101000011100110011001111010001101011010000000010110011000101101101001101101001110000111001011010110110001011111110110011001110111000001000000011110110110000111110111110100100010101100111011010011100101100110100011100111 0101000000100101100011001111000000111010101110010010001111011011010011111001011000110010000110000101100100111110000001000111101000010100101000101111101110101010011100010101111010100101001011001101000000000010101011001101100110000010100011011110101101001010110100011011011010110000110100000110011011100010011011011000100101011000111011001100110010111110111001101010111100100100110101011011000010101101 0000010111000100010101100101010111101010110111000011010011001101101111110000011001011110010011110001101001110011001001110111100111110111100101110000010111100011001110100101100100101101010000110110100101101011011110101011100110001101111011000110010110101011011111000101011010011001000100011010000000000101110111101111101011110110111010111100101001001100001110010111010011010100110010001010111101111101 1101111010110000111010100010110011010101101000010100011111111000010111001101011000101011000001000000110000011001000100010010110011010010000010111110110000011001101010100011011010110101101101001000101011110001011111101101100001101011101001101011111110110100100111110101101110010110100000101001000001110111000111110001000111010111010110011111110101000011000100011101100101011100111011000010111001101111 1101010101111010101001001011000010111101100010001000001101011101011111110010010100011101010011001101110110111100110100000110000100000011100001101001100111101100000111100100111100110110000000011001100101101011011111001100100111110101000010100101111100010010111011011010100010001111101110101100000011111100001011100010100100101010000101111011110110110011010001100111010101100100101000110111000000000101 0001001110000110110111100001110111000011101000100000110110100011001110011011111010111011010001100111010111110000010011011100101100011111001011010001101101101000100110000001100000110101110000010010101110000111111001010000010100001101110011001010110100011011101101011100010100001101100111111110111110000111000100010010110101010111101010110100111111001000101101010011001101011110001000111000011010001001 0110111001100011010010001100100000100011111100110100111010000011000100100100011011000100101011101010110110101101010000110000110101000100010100100100110101000110010000110111100100001110111111000011010101010010010110010001110100111010001001110011101100011111001010100110000010000101010011011101011101111001100000011000110010011000010111101101110000110111110000001101011000000011011000100011110101101110 1110001110111110101000000111101100011110001001101001100000101111000111111000000001000010011010011010110101111111000111011110100101010110101111011001000011010001101110011010000010000100101111001010011101111011110111011011011101001010001110010110110101000011111100110011110100110111001010000110001011001101100111101000100110010100000001001000100001111010001000000100001011110011100110101111110111101100 1111110010010001001110001000001010111100110010001110101001100001001110101101000101010011001100100000111101100100101101010001011100111010110011000011100010000110110011110111010100011110111101011101000110010101001110111100000100111011100010000110111001111001110101111101001001111010100000000011001111011010001100000100011010001111110000111010100010100110010100010001011010111001111000111000000011011001 1001101011000111001010011010011101110110010110010111000000010110000001011001011100111111010101100010010111111111110001111110011000001100011001010101011000111011000001100110000011010001000011110111100010001110111011111010110010000101010110010100000010100010010001000011110010011101110100100011010111010111000100000001011010110100010000000110011110011001101101011101000111100110000010010100010010010000 0011001111100110010010001010110101110010001001100000101010110011101001100010101010011101001000111010111001000111001100010110111010111100011101111000000111001000110101101000110011100100001001110100100011000011100101000011001010010101111001011110010111011100100100100110100100000001100110011000101001011011000000000110010000000100000111101011000110110001100100011010100110001000000111111001110100101001 1010011001100010110101101001100110001101100111010111101011100001000101011101101011110000111110111001110111101110101100110100000011110111000111110111110001100010000110110101100100001001100110101011101110101111110111000001110100000110000100101101110110100001111010100111000110001011110010111011010000011111000110000010100000000011001010100111110001110111010010011101010010100110000011111110101110100000 0000000000101001011100010100101111111100000001011111111111010001110010100111001101000011001000111111000110111100000100110011011100110110001010110001110110000001011111101111001100100010001000101110011101001011011100000001110100011111000010001000000001000001110110100110101111100001001001000000000010110111100100110000100011000110101110000100011011111100110011000111110001101001111111101010100001100111 1111000001011101111101100011000100110110011101011101010110001111100001011010011001100110100101011000111100011110110001011101000101111100100110010010011101111110101010111111111111011010111000000001010100100001100111000001011010110010111100000110100100010110111100000111100111000100000110100011111111101110001111001010101110010011000001100000100101101000110000011101000110111001111100100100100010111000 1001000000101110011100101011101001100110110111111111000110101010000001100110011110011011010101110011111010100111110011001110001100010111011011111101101000011000010001001100101011101110111000010101001010100101110110001111000001101101110101111101011100100011010001011100110110010001100101001100101000110110000000110000111101100101101000100110111010100111111010001111010100111111111101101100101111100110 1111011111111011111010100110111011001100110101001111100101100111111001010110110001100011110110000000101111001110101000010001111000000001000111101011010000000110101000000000101101011010100111100010100001111000010101100010101100000011000010001011111110011000110111111101000011100000011011111011010100010010101001000110010110110010010100010001111000011000111001011000011101000110100001001111111010000010 1010001001000001000110111100001111110111101110011011000101001111000100101101011010000100110111110111011100001001010000000100111100010001101010001011100000100110101110110100100011000101001000110100101110001101011101101011000101101011110010100000101101011101110011100111011111100001011000101010000110000101000000000101110000001100010011001010101101110011010011001010111001010011110001011100001010111010 0101011101101100010000111111110001110100110110001010111001111110000111110110000110010000001110100101011100110001001100001011000001011011100010101101101010010001000111001110000011011000101000001011101110111111101111000101001001111001110011111101001110100100000111100100011001001010110000100010011000101010110011010011010101000111011011110001100110010001101111110111100100001111100110101001101010101001 1111111110010110100000000100100011110100100111011001010011101101010111110100110110100100010110001111111110010101001010100010100010001111010111000011010010000110000001111110100100111110010111011011001111010101010101010010010101001110100110010010001010010010011100010001001000010100001000110001111001001100011001001000110010000100000010111010101110111100111111110000001110110000010011101011000101001000 0000001000011100111111110010101111100100011111011111101011100000010111001010010010100101101101100101111011110101110111100100111111100010000101100011001101011110000100010111111100101000111110101100010110000100100110000001001001101001101011110010110100110001111011101001100011001010000011110100000100011101100100011111111010011010011001011010111100001101101110011101000000111010010101000011110101000110 0011010101010110011010000010011010001011101010011101011101000110101000101110110000000100000010101011110101111110111110110110000111100001001111001100110011001111001010011110110001101101101000100100110101100000001111100100111001000110000010000001100110001110101101011000000010001000011110100111111010000000011100110100010101101010111110000101011000111111100011011000001110101101000101100111101011000010 0001100000001101100110000001000010001101101110101100001110111101000100111000110001010110011111000101101101010101001000110101100111010100011001100010111010110100000100011100011001101000011011100111101010011110110101000111100100001111111100111111100000010011101011110010011101010111000011010000100100100000110011101110110001101101100101000000010101010101011001000100110100111010011110111001100101111000 0110001001110011110111010010101111000011011100011001011011001000111001010100100011110010100100011110111010100011010110000110010110010000001000000100111010011001010110110111001010001000000111100100101001111000000110001001100100100011001111010010111100001010011100011000010110011010100001010111010001011100100100010011110010010111011110101010110011000111011001000100010001000100111000110011110010001010 0101011001001100010101011001011000010000010011011110001111001000001000010001000001010010001111011000110111000010001011000011011101000010010001100010111100000111001101011101101100111110111100111000000000010101010010101110011101011100101110100000000000011111110011101111000100100100110000011001110111111010000011110000110100101101110110100000001101100100111000101100011111101010111100101111101100101100 1010101011100101011010100010100001101111011010110000100100011000110110010001110011010111110001010111011101110011001100001010100001110000010001000111001100110001011000100001111001101111111010100110110110100001010100100000110010101100011000110100111011010111110011111101000101011001110000101000110011000101000011000100001101100110110101100010010000101010010100110111111001111010001010010110011111100110 1011001101001011011001111111010001001111101001011110010100001000000100000101011010110111000010110101010100101000101101011000111110010001111100100010100111101110010010100000100101001000111100001010101001101101000011011011001100100011010010110010001010110101111011000011010111001001111111000010110011001001010101101011011100010100100001100100011001000100010100100001011110000110010000000100010101101000 1001101010001111011101000000000110000000111010111100001101100001000011100110011110100001100011010110001101011001011110010000000101100100010010111101101101010011000010110000010000111010111110011101000010101010101100100101111001100111100010111001011110001000011101110010101000100010100110111111001011000010100111100101110101000011110000101001110110100010010010001100010011001101101010001101001110000011 1101101101011000001011011101100011100100000001011111111111101101001110111010000011110100110101100011001110000011111000000110111011011010111100111011001010001011100111100001110101001100001001100110101011111111110110011011100000011101001101111011111100101010110100001101011101000100000011001111010011011001110010110100110011111011010110011101011100010110100000000010101000111111011011001001100110101001 1101101100000001000001001111101000010000001110100100101100101010100010100011111100011100000000110000011100000101000011111100011111101010101000010001000111000110100011111001100111010010101101010011011000100010101100111100010110100010100000001001010011011100011010101011111101101001000100000001011011000001011100101110001111010111101111010011001111100100100010101011010011010000010010011100110110010011 1111010111000000011110011101011100100010011100011000010100111001111110010110101111101000111010101101000100100010010110010111111101001001000010001011100011100110110111100101101011000110011101010010000000000111101010110110010011000000110101000111101000000101111010111001011011101110011111011100110101100100111011010010100000001001010111100000101100000001100010001100101011001001110100010100000110100011 0101010000010100100111001111100100001110011000110000110100011010111000010001001010101000011000101100001001010111001100000101101010000100000101111100001011011011101011110010100000110011111010001010001010001001000010100111110100100111100100100100101110001110110001111001100010011111011010011100100001011001001100011011111100110000010000011110110101111010011001100101101100000101110101010011111110101011 1111001011001111010101001100001101110101011100111011101111011000110011011010011010100110000000101000001011111011111100110010111111001101011000110011100111000101100010010010010010110110001111101111001001111110111101101010101111111011110110011111110111001100011111111001111011000000001011100100110110101011100111111100001100101111010111001111011111111011000101111011001011110000011000001110110101001011 1110111001111001010111100000000101111000111001111011011110111010001100110001001111101000100011100010110110110000100110011110110010100011000010001011011001001010001101111101110010101100011100110000110111001001101001010110010000001000110110111010010011100001110100010000000101001110100101111010110100110000011110101010101111100011110010000111000010000000011110111111100010001011111101110010000010001001 1101101011010101111000000001100101000101000110111110111111011111001001110111001010110010011111101010110100011000010010111101011000111110100111000101100010100101101111110010110101111111001111011111010001011011101100100001111111111010010010101101001000001111011100110101000101100100111011101110001001111100000010011001010110010101100100000111111010000100110101011010011110110001100001000101010101101000 1111110110010011100010101001111111010000101001110011100000011010001011010011111100101000011000000010010100001001010000010101100001100010001011000100001001010111101010000101001010010001000101011100110100101001001101001111101000100000010001000011011001000101110010010101001000001100010110001110010100100111011011001010010100000011100010101000000111000011001101001100000101011000011101110000000100100010 1001110000001110001101001111000001100100011101011100100111010000011101100110001110111110011101111111101100100001010111000000110000101010001000001010100101111010100011100010100100000101011100010011001011110011001010110110010110110001010100100000100110100001001010100100000010011101111110111000010100010010001011000101110010101000101100001000101100100011111000001011001010010100111000111001111110010001 1011010111111110100111001110100001010100110000000100110001101011010110010101110000110011100010001110101100100100100100011001110111010110111011110110000010001100010100011101010010101000101111000000001110100111100100110111011010011010001111010100010010000110010101100111110101001110100101001000110001000111101011000110111100111011001011111110111111111111011001001000010001000001011111111100100111110101 0101010011010111011000010001110110101001011100001011011010101011100011010011100100100111001000101101100011000100010010100011100011111011001110111100011100011101011111110111000010000101010011010110111111100110001001111000010000101000001000011101011000000000111110101000100001010100001111001010001110100011000010110010000000000111101011000111110111100010000101101111000000110110100101000010100101000101 0110000010011111101111100100101011010001011000111101001000111100101010001000000100101000011001101010101000111001001011011101001000101010101100111011000001001110100110010011001110000101110000001011100011000100110010111100010000110011101011010101111100010010011111000110101100111111110010110110100111110101111110110100110110011111000111110000111011101110100111110101110101100001110000001111111110110100 1011011110110011010010010001000111010001111111000010010110011101100111110111000001110101101101100001101001101111011110100101110101111111111011101111001011000011011101000101101110001001010011111100001001011001000011100110111001010000001000110010011100111010010110001100101110110111111000001100110000101111000011000111011011101010011010110010111101011010011011111011101000100011100111011100001111101111 0101100011111000010100001011000000011011110001110100110100100100000001100101001111011100010000000000101100111010010111101010010000101000110101101101101010011100000001110011011010011010100100010100100011110100001010111100001101110101001101110111101101011111000101111110011100100011010010010011100000100011011000010010011011101101101001110000000011111010000100110000111000101110101000110110011100011111 0101000101110101010100100101000011011100001011010010011101100111011100000000101001111111111101001011111000101111000110101110101111111011111101110100000001001000011000101011011000011001000011101000100110110100110101001000001111001100001111110101110100011110011100001101110001110111110000101111100000011000110111110010100101011110001100001000111000011101000101010000010110001110000101110011100101010101 0111101000110100000101101111001011001101101010000110011111111001000100001111000010100000100011011000000000000101001011011000010000000111101011101011100010000111110110100101111010111010110111001011100001111111000111111100100101110110100100110011001000110110110000101110010000000111111001100001001100101111111101000011111000000100101110101011011101111010111011110100010111100000000111001110100010101011 1110001010010010111101000010000011110001101011111110110000001111110011100101001101100000110011011010011000000010010101101100100010111001110010110001110010111100100111000010101001100001001011100000010110101011001111110010000011000100010100010101111100010111100001100111011110000110000100010110011101111100100110000101011100011111111110010101110010100010110000001101010101000111010110010011111000011000 0101000000101110101111100011110110011101010011010010011111010110110111011101000110100110111010100100111110001001001001101110100100011100110110100011100110111101011000100001100111001011011001111011110010110001110101010100011111001110011101000101001011010010010100111001111111010111101111010110011100101011111111101101011000111010010111010110001100101111010100010000001111110010111101010001111110010101 0100011110110100111000000011001010010110111001111110001000011101101101010110100010001011101111001100101110001111101111000000011100011110111101010000100010101010001000000001010101000100101110001101001010011110001101110100001101110110100110000000111110111001111100001110010101100010110011101101111010000010000110000000110010110001001000111010101111100101011001010001010010010001100001110101101000100100 0100100001111010010110111111011100111111010010011010010100111011101101010000011100101011011011001110000101001010100001110001000010110001100100101101000001110001011111110000111000111001000101101001100010110011001011000001111110111100010011001010011010010000101101000100101100100001110101001100101001011000100110101101011010101000110010000111110010011110011000110110010000011001100110110000011111000000 0010011010101100001011000001110110010001111111111101100011101111101110000001010110110100100101110101101110111111111011101101100001011110100100010010111011111010010111001100100000001111101100111001100100001110110010001011000000010100010100001101001100010001111100100110111101000100010111110111101001100001110011011001101101110001011011101101101111011001000001110010111111000001111110001000111010010110 1010110100001111010110011000111001001111110101000000111111000001100111111101000111000110011001110110100111000000010000000001000001000100010111010010010110001011011111100010000101110111011001010111100011000101011011101110001000010110101000100100100101010100110001001010010010110111101001000010001010011101111101110111011101011111011001101001011100000101110111011100100010011111010101010001011001101010 0000001100101001011011100111110101111110010010101111111010100100110011010001010001111001110000001010001011110000111100011000010110101000011101010010100001010000101111001110100111011111001101011110011110001110011111010111100110011000000101111100000011110011010011111000110110010100111011110011010010111000110101011001000000110100000010011110011101110001111001111110101101111110000000101000111000000100 1110100000111010111011010001100000111011101010011110010001000001110011000010110110001111010101011110010001010010011110001000011011100011010111110001010010001000011111110110010010111001111001100001010110101000100000010000101100100001100111011111001000101010000111111100001100001000101110100101001010010000111001001100010010000000110101000111111111011000110011000111000111000000000001011010110001101101 0011101010010100110101101001011111000011000111100010110011101111100101001110010000010011101100110101111110111110001010110110000101101010001110001011101000010001001111011010101100100001101101000011010100001110101010001000010000111001010000001101101000111000110000100101110100110100001100000010011000100000110111111010110101101101111111101000000110000110110100101010011011111001100011101001011010010101 1101110100011111001110111101111101010110001000000011001110101111101000110111010110111111111001011000100111001101111011101010111111011111111011010100110000000000000111001111011111011111110011100111101001001110110110001001001101100100111011111010100111000010100111101010001010111011000001100000011001100010001000001000100010011100000000000100001011000011100110001101010001010110001110011111010010101101 0010100010100011101000001010001111000100001001011101011001101000000111001111011010010110011010000101110001100010000110111010000111100101001010011101000011110100100100000001011111011111000011000100000011001000111111110110001110010000011101101111000111111110111010000010111001101000110101010101000011110110001001110000100001011000111101110011001111010001001011101000101001101000111111110010011000001000 1111001011100110110111111000101101101010100001111111111111110101110010101001111000110111111001111111011011111010100110011101000010011000100101111110011100110000110000001100000101101100000110111001011101011010100111000110110011110101110011100000101111111101000011111010000000001110000100100010011010001111101001101010110000000101110110111010110000011000010011001001101111001011011011000101011101110110 0011101010010010010010100110100111000010000000111111101100100001111111010111000000101110100100001111100001001100100110001111000101110100001011111011001100100100001100110010100101011111100010110010001111101010011101101001010100000010011001000100011001011001110001111010100100101001010110010111100100011111110000001100001010111010101011100110011011111011010001000111000110010100100010101111100011111100 1010110110110100111110111111011000101110000101011111011000001110100001111111100101001110101100111001101101000011111010101010011000111011110011000100010101101011010000100111010101000100011111010001010110010011010011111011011101001101111000100110010101001110110011101000010010110101110001010010010101110101010100010100011010010111100111011010101100001000101101110011000011101101110000011011101000101110 1111011000011100011000010100111110111111000011000001100010001001100010010011100101000011000111111110111000101111100101101110111100011101000000100111101011111111011000111101110110011011101001110000010001000011100111011100101000001001000000100111110100111110000010000010111000110011110000110001111000010110011111000011111110000111110110011100000010000011101010110101101000101110101010101111111010110011 0111011000110001000010011000011000000001101010101101110111010111100001110010001001110111111110101110010101100110100010000111010000111000100011000111111110111000010001110000001001010000010110000000111000001111010100001111100000001101001111011001111111010110010011011111110100010100000000101011010101011000000101111110001111001100000000000001011011101010010000111000000010110010100010111011100100110100 1011011100000100001011010101000101100101110011111100100101010111000101111000011110100101011110010100100100100110000001100010111110000111101001111011011101101001000100100010110110000011010110111000001011100011110100011001001100001010101100010000000101110001000000111100110101010100011101010001010001111010110111100000000000001111101010000101110100101011011010000000010101010111000110100010110000100011 0111111001011100011100110110111100000100001001010111111000101100010110001100101010101000110101110111101001001111011000001100110100001100111111111001011110001101011000101100011101011101100000101110000110010111110010001001011101100000011111101100101010110101010000001110100101110010110101101110101100010100100011110111011011111011011000101010111000000011101101010010111010101011101100110000010011011000 1101010110101100001101100011000000010010000010111011011011111110101101101110011110101101100101010111111000010001000011010110101001111101001011011100100111011111001000010010010000011111010010000011000011101010010101001111000110001000010100111011001101111000010101110101100100000100101000101110111001011101010111010010001110110111000000011000111100010111101110100001100101100001110010000010100001000000 0000100101110000111101000000011011100111001110001001101110001110111011010111111111011011101010000101111110111000111100010111111001111011111011011101100011011000000100001101111100000011001010101101100111111011010000110101000001111010100011101011111111001001110001001000000000110100011001101001110101101000001010010111000111011111000011111010011101010010000000010111011101110101101100111010011011000101 1100001111101111010100000010001101000100011011100110011011110101011011111000101001100011111010010100011100110001000101101111110001011001000010011110010010110011000011101100000101011111110110100001001000010111101000110101000000101100011000111110111010000011001100111101000111011100010110111111111000001100100100110010111100111010001000001100000101110001111111010010001001010100011111100100101001101100 0100110001000010101100110000110000001100101000010011100100100010011011010101111011001011110100011110100000110101010111001001100010011111011010100001011000001110001010100011100101001101100101001001011111001111101110111111110011010011100001001100011011111111111100001111101010001110110010001100100000101100111100010110100001100101101001111010010011000000010010101111011010011100000111111011110100101000 1101001111110100111011001000111100110111111011101010001100110001111010001101010011001111110001101001011000110111010110110000000001010110001101100000100010011011011011110110110100100100111100100011110100001001000101010100110110110101110100001011000110011101011011000110111111010100111001101101100111001011011010110101010101010100111001000011001000101011010000010011011110010100011100100011001001111110 0001000110111011011000101010011011001000110110111011101010111101000110101001010000111000001000110111010101010101011101110000101011000111110001000000110011101000111000000011011110000010101110100101011110100100000100100100101101000000100011101100101100000101110101110010000000010101001111010001001000111001010011000010000110101001111001101110010100000110010010000101101000111111111100010100011000100100 1001111111011110010000110010001000100100100101111110011100111000111000100000000100001011101010101001100000101111000001101101001111000100000000111010001001101001100111111000111110100000110101011101110000001101000111111100100001000000111000001000010011101010101100101111100101111000010111010100011000011101100111001011011101101011000011001101010110011111111010111011010101001000110101000100010111010001 1101110000010111010100111110111011010111111100100111010011101111100100001010110000110011101110011010100111011110100011111110011110001010100000011011111111100100111111101010100000000000111110100010101110101010110010100001000110111001101101011001111000011000110000000100010101011100011001110001100110110100110111010101000111000011000111100010001101011010001100101001110001010101110100100101001001111100 0111111100111001011001010011010110010010010110011101010001010011011100110101111001101000100010111010111110111110101011100111011000101111110100111101010111000011111110100001101011101010010111001001000110000001110001111110011001101110111011110010100010111101100001110011011111111100110001110001010110111101011010000110111110000111000000010110101100100001101010011010100010110100111000111001011111111000 0000100011101101111011110011101110000011111011011101101010011111010110110111000111100010101101000010101100110000011000111101101101011000010011111000100110100010000110101100011110111010100100101111100110010001011110011101101100001101000000110000110111001101011110110111010100001010101111100100100010010010010011000000101011001110101101101110111101111110000101001001111100110011000011001101001100000101 1110101110100101001100010010010001001110101011001110000000111100011111011111110011100010100101110000000000100110000010001001010110100010001000110110111011111111000001011000001001111001011011000110011010011001011010011111101011000000101001111100011001011100011100110100001010101000011101101001010001101011101100011100011100101001010110101101010111100010101010000000011000110010111100010011100001000000 0100110111001001110100011101111100110010001100010100110101000000011110100001100011010001110010101110110111010110100000101101101111101101011100110010110010010110111101100001101010111101100101000110011011100001101111100011001111101111110100000101010100111100110001000000100111101111010101001011110101000100011001100000000000001101010100111100000101001100001100110011011011110101110111101100100001100000 0100001111011111001000101011001100010111011111000111110011100111010101000110010010010000011100011100111110111101001001100010100110010111001000101001100101001000110000001001000011001101001001011101110111000101001011110001010001000100110011001111011111000101010101111101011010101011001010011100000111111100011100011000100111001001110001001100010000100111100000101001001010100011000001001001101111010110 1110111010111100111000001011110111111111110110110111100000001110110010111001111100000001110100000101111010000000011001110110110110101010111011101110001101110010111011111110101001010100110011000100101000111101111101000110010101111000111000110111011110110011011111000011010110110101001101000100001101100010110010011001011001110011110101111010010000000000011000110000010000110110000100110010001010001100 1110111010011010110110100001111000100110101110111001110101010000011111000111110000100101100010000010111011000010110111010101011111101000100010101101100000011111110000111000001010100110100001110010101111001011100010100110111101010111110011110111000011010111111100110101011100100100011100010100111100000011111001001011000111001111011111100101001001011001000010101010101000111111000110010001001000000110 1100010110001001110100111110110011101101000110001001100111000000001101111010011011010100000001100010100000100110100000100101001000010101010001110110001010101011000111110000100011100110101010101001001100101000101111011110110011011110110001101101010101101011000001101111000111111000101101110001100100001111000010100000101110111100111100010101100111110111101000110111110110010011100110000111111111010001 0100011111000110110001110011000000000001101100001111011110010010000011111001111001101001101111110101110110111100100111010010011000100000101000011100101000011000001110000100000010110111100111000111001111110011101101011010111010100110111101001011001011110100001111001000000110100110011110110011101001011001001100111110110100101010100101011010111100000010110101101100101101010111110101001000000010010000 0010000010110011010101100010100111100101011001111000100011011111111000111011001001010110101111111011001000111110100101101011010111110101001111101110010001111000011111010001000100010110111101010001100010010011000100001000101111100001010000010111110001001110100101000001011010010000111110001011101011011001010110111101000110100001010001001001011111000100111110110001111010000000010010101001111110111011 0011100001101110100001000011100001000000100010100011110011101000101011100000101010001010100000111100101111111100011101100110111011010110010010100101001111111101010110000101001110001100000000001010001010110100011001000111010010000010100000001011011011100000110011100110111111011010101011001110111001011010100001111110110011100101001100001001111100110001101111010101010010110001100110110100111000110111 1101010011010111101011100111011010100101101111001111010101011010110001011101011100001011101010111100101010011000000111101100010010000100100010000100001110001100000111001101111111110010001011100001101010011011010001100000110101000110100000000110001111011111001000001010100101101100011001000110110001011111110101101011010101010011100000100001111100001010000110011101110010011000101001011110011001000001 0100000000001010111010000001110111110010001001111000010000011101011101111011110011011100110100100011101111010010101011100000001000001011111000110101001110100100001011111110010100110110011011111101101110110011111111100011011000110011100111110010111001111011001110100101111101101110001111011001101011001101100001111000100111110001011000001010000000101011111111110111011100100000101010110101101100100101 1000010111100111000100111000001001011011011010010000000001100011011110111011100110000100101101111111111011111110001111011001110010100000001101110110001001101000010110111100111111001111101100010011011101100010110101001111010111000100101110001110101111110100100110000011111000000011001101011011010100011100111100101100101100011010101001100011010000010111101101000011100111000010111101101101010000110000
cTrader Algo

【cAlgo】サインツールを作る【SampleCode】

5/1/2021

4年以上前の記事です。内容が古くなっている可能性があります。

サインツールを手軽に作りたい

サインツールってあるじゃないですか。こんな感じで売買タイミングを示してくれるインジケーター

もちろんサイン通りに機械的にエントリーするなんてもってのほかですが、決められたルールでサインが出たときだけエントリーするかどうか検討する、みたいな使い方をしている人は多いと思います。

今回はcTraderでこんなのを作ってみましょうというお話です。

 

単純なサインの出し方

例えば、終値が20期間MAを超えたら矢印でサイン出したいとしましょう。こんな感じかな、と。

SimpleMovingAverage _sma;
protected override void Initialize() {
    _sma = Indicators.SimpleMovingAverage(Bars.ClosePrices, 20);
}
public override void Calculate(int index) {
    if (Bars.ClosePrices[index] > _sma.Result[index]) {
        Chart.DrawIcon("buy_sign", ChartIconType.UpArrow, Bars.OpenTimes[index], Bars.ClosePrices[index], Color.White);
    }
}

ただ条件判定して価格部分にChart.DrawIconでアイコン描いただけです。

でもこれだと少し問題があります。このあと、値が戻ってMAを下回ってもサインが残ってしまうのです。

おそらくこの類のサインであれば本当に知りたいのは「バー更新時に前の足の終値がMAを上回ったか」だと思います。

であれば、バー更新時だけ条件判定しましょうか。

SimpleMovingAverage _sma;
DateTime _lastTime;
protected override void Initialize() {
    _sma = Indicators.SimpleMovingAverage(Bars.ClosePrices, 20);
    Bars.Tick += _=> {
        if(_lastTime != Bars.LastBar.OpenTime) {
            OnBar();
            _lastTime = Bars.LastBar.OpenTime;
        }
    };
}
private void OnBar() {
    var index = Bars.Count - 2;
    if (Bars.ClosePrices[index] > _sma.Result[index]) {
        Chart.DrawIcon("buy_sign", ChartIconType.UpArrow, Bars.OpenTimes[index], Bars.ClosePrices[index], Color.White);
    }
}

IndicatorにOnBarメソッドはないので、自分で用意してあげる必要があります。(BarOpendイベントやIsBarOpenみたいなプロパティはあてにならないので非推奨)

とりあえずこれで更新時だけサイン判定ができるようになりました。

しかし、これだとリアルタイムでの判定はできません。実際はリアルタイムで条件満たしたら未確定でも一旦表示してほしい、ということも多いでしょう。

ついでにいうと、これだけだと過去のサインは表示されません。表示させたければ、Calculateに別にロジック書くか、過去分判定用処理をどこかで別にする必要があります。

 

いろいろ考えると結構面倒

ただサイン出すだけのツールとは言え、作ってるといろいろ出てきて結構大変そうですよね。毎回サインツール作るたびにこんな共通ロジック部分に時間かけるのもばからしいです。

というわけで、これらの要望を簡単に満たすべく、サインインジケーターのテンプレートとなるIndicatorを作成しました。

これを使えば面倒なことを考えずとも条件判定ロジックのコードを書くだけで、サインインジケーターが作成できるようになります。

 

SignToolsTemplete

主な機能

・サインはリアルタイムで表示されます。未確定のバーでは出たり消えたり繰り返します。

・サインが出たら音声とチャートに色付けてアラートを出すことができます。(アラートの色はチャートがアクティブな状態で何かキー押せば消えます。)

アラートを出すタイミングも指定できます。「その足で最初に条件満たした時点」か「毎回条件満たす度」か「サイン確定時 (足更新時) 」かのいずれかで指定します。

・検証用に過去チャートでサインが出てる場所にボタン一つでジャンプできます。(冒頭画像の右下のボタン)

 

ダウンロード

こちらからどうぞ。サンプルとして2本のMAのゴールデンクロス、デッドクロスでサインを出すツールになってます。

Indicatorクラスの中身を自由に書き換えて、お好きなサインツールを作成してください。

 

使い方

ダウンロードしたサンプルを見ればなんとなくわかるかもしれませんが、一応解説します。

仕組みとしてはSignIndicatorクラスにサイン表示やアラートを丸投げしてるだけです。作成者がやることは判定用のメソッドを作って、SignIndicatorオブジェクトに登録するだけ

 

①判定用メソッドを作成

まずはどんなときにサインを出すかの判定メソッドを作成します。このメソッドで受け取るindexはCalculateのindexと同様のバーインデックスです。

ダウンロードしたサンプルをそのまま使うのであればBuyOrSellメソッドの中身を消して、ここに判定ロジックを書いてください。

//-------------------------------------------------------------------
//  サイン判定メソッドはこんな感じで用意
//     必ずindexを受け取ってTradeTypeかnullを返す形にする
public TradeType? BuyOrSell(int index) {

    // --- ここで条件判定を行い、買いサイン出すならTradeType.Buy、売りサイン出すならTradeType.Sell、サインなしならnullを返す。
    if (index < 1) return null;
    if (LongMA[index - 1] < ShortMA[index - 1] && LongMA[index] > ShortMA[index]) {
        return TradeType.Sell;
    } else if (LongMA[index - 1] > ShortMA[index - 1] && LongMA[index] < ShortMA[index]) {
        return TradeType.Buy;
    } else {
        return null;
    }
}

自分で作る場合は返り値と引数の型さえ同じメソッドであれば名前は何でも構いません。

買いサインを出したいとこで、TradeType.Buyを、売りサインを出したいところでTradetype.Sellを、条件合わないとこではnullを返すようにします。

 

②Initialize内でオブジェクトを作成し、各種設定

Initialize内でSignIndicatorオブジェクトを作成します。コンストラクタにはthis(Indicator本体)と、①で作成した判定用メソッド名を渡します。これだけでサインツール完成です。メソッド名を渡すときは末尾に( )を付けないようご注意ください。

以下はすべてInitializeメソッド内に記述します。

// --- サインインジオブジェクト設定
var sign = new SignIndicator(this, BuyOrSell);

設定は特になにもしなくても動きますが、色やアイコンを変えたい場合はプロパティで変更可能です。

// --- 色やアイコン変えたければ変える
sign.BuyColor = Color.Blue;
sign.SellColor = Color.Pink;
sign.BuyIcon = ChartIconType.UpTriangle;
sign.SellIcon = ChartIconType.DownTriangle;

また、デフォルトではアラートは作動しませんので、サイン出た時に音声ならしたいならSoundFileにファイル名を、チャート色変えるならAlertColorに色を設定してください。音声はNotificationsプロパティのPlaySoundでここで指定されたファイルをそのまま呼び出します。

// --- 画面色替えアラート。色を設定すると有効化
sign.AlertColor = Color.Yellow;

// --- 音声アラート。ファイル名を設定すると有効化。フルパス指定の方が確実。
sign.SoundFile = "C:\\Windows\\Media\\Alarm01.wav";

// --- アラートタイミングを変更。デフォルトはUpdate(バー更新後のサイン確定時のみアラート)
sign.WhenAlert = WhenAlert.FirstAndUpdate;

アラートタイミングはデフォルトは「確定時 (足更新時) 」です。タイミングを変えたい場合はWhenAlertプロパティを変更してください。

 

その他

サイン表示だけであればCalculateメソッドは使用しませんが、サンプルではサインのタイミング確認のため、サイン判定に使用するMAを表示させています。この辺りはツールに応じて自由にしてください。

また、サインをトレード検証に使うなら、右下に出現する次のサイン、前のサインにチャートをスクロールするボタンが便利ですので是非ご活用ください。(不要の場合はコンストラクタの3つ目の引数にfalseを指定すれば消えます。)

 

SignIndicatorクラス詳細

細かい設定したい人用に。

プロパティ
(ChartIconType) BuyIcon { get; set; }

買いサインのアイコンを設定します。

(ChartIconType) SellIcon { get; set; }

売りサインのアイコンを設定します。

(Color) BuyColor { get; set; }

買いサインの色を設定します。

(Color) SellColor { get; set; }

売りサインの色を設定します。

(double) DrawMargin { get; set; }

サインの描画Y位置のマージンを設定します。買いサインはローソク足の最安値の下、売りサインはローソク足の最高値の上に表示されますが、その時価格からどのくらい空けて表示するか設定します。

(int) JumpMargin { get; set; }

◀▶ボタン押したときにサインの右側に何本分のローソク足を表示させるか設定します。

(WhenAlert) WhenAlert { get; set; }

アラートを出すタイミングを設定します。デフォルトはUpdate(バー更新後確定時のみ)。設定できるのはFirstTime(最初に条件満たしたとき)、FirstAndUpdate(最初に条件満たしたとき+確定時)、EveryTime(条件満たす度毎回)のいずれかです。

(string) SoundFile {get; set;}

アラートに音声を使用する場合、音声ファイル名を指定します。フルパス指定推奨ファイル名のみの場合、C:¥Windows¥Mediaフォルダ内のwavファイルを探します

(Color) AlertColor {get; set;}

アラート時にチャート色を変える場合の色を設定します。

(WrapPanel) ButtonPanel

ボタンを表示しているパネルを取得します。ボタン位置を変更したいときなどに。

 

メソッド

パブリックメソッドはありません。コンストラクタが一つあるのみです。

SignIndicator(Algo algo, Func<int , TradeType?> judgeMethod, [bool showButton])

1つ目の引数はIndicator本体を渡します。Algo型を取るため、cBotのRobotクラスでも使えます

2つ目の引数はサイン条件判定用メソッドです。indexを受け取ってTradeTypeかnullを返すメソッドなら何でも構いません。

3つ目の引数はジャンプボタンを使用するかどうかのオプションです。省略するとtrueになります。使用しない場合はfalseを渡してください。


まだコメントはありません

新しいコメント

コメントは承認後に公開されます。承認まで次のコメントは投稿できません。

cTrader's Life

© 2025 ajinori